mirror of
https://github.com/grafana/grafana.git
synced 2024-11-29 20:24:18 -06:00
4cd2575ad0
Co-authored-by: Ryan McKinley <ryantxu@gmail.com>
162 lines
4.1 KiB
Go
162 lines
4.1 KiB
Go
package pipeline
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/grafana/grafana/pkg/services/live/pipeline/pattern"
|
|
"github.com/grafana/grafana/pkg/services/live/pipeline/tree"
|
|
)
|
|
|
|
func (r ChannelRule) Valid() (bool, string) {
|
|
ok, reason := pattern.Valid(r.Pattern)
|
|
if !ok {
|
|
return false, fmt.Sprintf("invalid pattern: %s", reason)
|
|
}
|
|
if r.Settings.Converter != nil {
|
|
if !typeRegistered(r.Settings.Converter.Type, ConvertersRegistry) {
|
|
return false, fmt.Sprintf("unknown converter type: %s", r.Settings.Converter.Type)
|
|
}
|
|
}
|
|
if len(r.Settings.Subscribers) > 0 {
|
|
for _, sub := range r.Settings.Subscribers {
|
|
if !typeRegistered(sub.Type, SubscribersRegistry) {
|
|
return false, fmt.Sprintf("unknown subscriber type: %s", sub.Type)
|
|
}
|
|
}
|
|
}
|
|
if len(r.Settings.FrameProcessors) > 0 {
|
|
for _, proc := range r.Settings.FrameProcessors {
|
|
if !typeRegistered(proc.Type, FrameProcessorsRegistry) {
|
|
return false, fmt.Sprintf("unknown processor type: %s", proc.Type)
|
|
}
|
|
}
|
|
}
|
|
if len(r.Settings.FrameOutputters) > 0 {
|
|
for _, out := range r.Settings.FrameOutputters {
|
|
if !typeRegistered(out.Type, FrameOutputsRegistry) {
|
|
return false, fmt.Sprintf("unknown output type: %s", out.Type)
|
|
}
|
|
}
|
|
}
|
|
return true, ""
|
|
}
|
|
|
|
func typeRegistered(entityType string, registry []EntityInfo) bool {
|
|
for _, info := range registry {
|
|
if info.Type == entityType {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func WriteConfigToDto(b WriteConfig) WriteConfigDto {
|
|
secureFields := make(map[string]bool, len(b.SecureSettings))
|
|
for k := range b.SecureSettings {
|
|
secureFields[k] = true
|
|
}
|
|
return WriteConfigDto{
|
|
UID: b.UID,
|
|
Settings: b.Settings,
|
|
SecureFields: secureFields,
|
|
}
|
|
}
|
|
|
|
type WriteConfigDto struct {
|
|
UID string `json:"uid"`
|
|
Settings WriteSettings `json:"settings"`
|
|
SecureFields map[string]bool `json:"secureFields"`
|
|
}
|
|
|
|
type WriteConfigGetCmd struct {
|
|
UID string `json:"uid"`
|
|
}
|
|
|
|
type WriteConfigCreateCmd struct {
|
|
UID string `json:"uid"`
|
|
Settings WriteSettings `json:"settings"`
|
|
SecureSettings map[string]string `json:"secureSettings"`
|
|
}
|
|
|
|
// TODO: add version field later.
|
|
type WriteConfigUpdateCmd struct {
|
|
UID string `json:"uid"`
|
|
Settings WriteSettings `json:"settings"`
|
|
SecureSettings map[string]string `json:"secureSettings"`
|
|
}
|
|
|
|
type WriteConfigDeleteCmd struct {
|
|
UID string `json:"uid"`
|
|
}
|
|
|
|
type WriteConfig struct {
|
|
OrgId int64 `json:"-"`
|
|
UID string `json:"uid"`
|
|
Settings WriteSettings `json:"settings"`
|
|
SecureSettings map[string][]byte `json:"secureSettings,omitempty"`
|
|
}
|
|
|
|
func (r WriteConfig) Valid() (bool, string) {
|
|
if r.UID == "" {
|
|
return false, "uid required"
|
|
}
|
|
if r.Settings.Endpoint == "" {
|
|
return false, "endpoint required"
|
|
}
|
|
return true, ""
|
|
}
|
|
|
|
type BasicAuth struct {
|
|
// User is a user for remote write request.
|
|
User string `json:"user,omitempty"`
|
|
// Password is a plain text non-encrypted password.
|
|
// TODO: remove after integrating with the database.
|
|
Password string `json:"password,omitempty"`
|
|
}
|
|
|
|
type WriteSettings struct {
|
|
// Endpoint to send streaming frames to.
|
|
Endpoint string `json:"endpoint"`
|
|
// BasicAuth is an optional basic auth settings.
|
|
BasicAuth *BasicAuth `json:"basicAuth,omitempty"`
|
|
}
|
|
|
|
type WriteConfigs struct {
|
|
Configs []WriteConfig `json:"writeConfigs"`
|
|
}
|
|
|
|
type ChannelRules struct {
|
|
Rules []ChannelRule `json:"rules"`
|
|
}
|
|
|
|
func checkRulesValid(orgID int64, rules []ChannelRule) (ok bool, reason string) {
|
|
t := tree.New()
|
|
defer func() {
|
|
if r := recover(); r != nil {
|
|
reason = fmt.Sprintf("%v", r)
|
|
ok = false
|
|
}
|
|
}()
|
|
for _, rule := range rules {
|
|
if rule.OrgId == orgID || (rule.OrgId == 0 && orgID == 1) {
|
|
t.AddRoute("/"+rule.Pattern, struct{}{})
|
|
}
|
|
}
|
|
ok = true
|
|
return ok, reason
|
|
}
|
|
|
|
type ChannelRuleCreateCmd struct {
|
|
Pattern string `json:"pattern"`
|
|
Settings ChannelRuleSettings `json:"settings"`
|
|
}
|
|
|
|
type ChannelRuleUpdateCmd struct {
|
|
Pattern string `json:"pattern"`
|
|
Settings ChannelRuleSettings `json:"settings"`
|
|
}
|
|
|
|
type ChannelRuleDeleteCmd struct {
|
|
Pattern string `json:"pattern"`
|
|
}
|