Files
akvorado/common/schema/config.go

116 lines
3.9 KiB
Go

// SPDX-FileCopyrightText: 2023 Free Mobile
// SPDX-License-Identifier: AGPL-3.0-only
package schema
import (
"errors"
"akvorado/common/helpers"
)
// Configuration describes the configuration for the schema component.
type Configuration struct {
// Disabled lists the columns disabled (in addition to the ones disabled by default).
Disabled []ColumnKey
// Enabled lists the columns enabled (in addition to the ones enabled by default).
Enabled []ColumnKey `validate:"ninterfield=Disabled"`
// MainTableOnly lists columns to be moved to the main table only
MainTableOnly []ColumnKey
// NotMainTableOnly lists columns to be moved out of the main table only
NotMainTableOnly []ColumnKey `validate:"ninterfield=MainTableOnly"`
// Materialize lists columns that shall be materialized at ingest instead of computed at query time
Materialize []ColumnKey
// CustomDictionaries allows enrichment of flows with custom metadata
CustomDictionaries map[string]CustomDict `validate:"dive"`
}
// CustomDict represents a single custom dictionary
type CustomDict struct {
Keys []CustomDictKey `validate:"required,dive"`
Attributes []CustomDictAttribute `validate:"required,dive"`
Source string `validate:"required"`
Layout string `validate:"required,oneof=hashed iptrie complex_key_hashed"`
Dimensions []string `validate:"required"`
}
// CustomDictKey represents a single key (matching) column of a custom dictionary
type CustomDictKey struct {
Name string `validate:"required,alphanum"`
Type string `validate:"required,oneof=String UInt8 UInt16 UInt32 UInt64 IPv6"`
MatchDimension string `validate:"omitempty,alphanum"`
MatchDimensionSuffix string `validate:"omitempty,alphanum"`
}
// CustomDictAttribute represents a single value column of a custom dictionary
type CustomDictAttribute struct {
Name string `validate:"required,alphanum"`
Type string `validate:"required,oneof=String UInt8 UInt16 UInt32 UInt64 IPv6"`
Label string `validate:"omitempty,alphanum"` // empty label is acceptable, in this case fallback to name
Default string `validate:"omitempty,alphanum"`
}
// DefaultConfiguration returns the default configuration for the schema component.
func DefaultConfiguration() Configuration {
return Configuration{}
}
// MarshalText turns a column key to text
func (ck ColumnKey) MarshalText() ([]byte, error) {
got, ok := columnNameMap.LoadValue(ck)
if ok {
return []byte(got), nil
}
return nil, errors.New("unknown column name")
}
func (ck ColumnKey) String() string {
name, _ := columnNameMap.LoadValue(ck)
return name
}
// UnmarshalText provides a column key from text
func (ck *ColumnKey) UnmarshalText(input []byte) error {
got, ok := columnNameMap.LoadKey(string(input))
if ok {
*ck = got
return nil
}
return errors.New("unknown provider")
}
// GetCustomDictConfig returns the custom dicts encoded in this schema
func (c *Component) GetCustomDictConfig() map[string]CustomDict {
return c.c.CustomDictionaries
}
// DefaultCustomDictConfiguration is the default config for a CustomDict
func DefaultCustomDictConfiguration() CustomDict {
return CustomDict{
Layout: "hashed",
}
}
// DefaultCustomDictKeyConfiguration is the default config for a CustomDictKey
func DefaultCustomDictKeyConfiguration() CustomDictKey {
return CustomDictKey{
Type: "String",
}
}
// DefaultCustomDictAttributeConfiguration is the default config for a CustomDictAttribute
func DefaultCustomDictAttributeConfiguration() CustomDictAttribute {
return CustomDictAttribute{
Type: "String",
}
}
func init() {
helpers.RegisterMapstructureUnmarshallerHook(
helpers.DefaultValuesUnmarshallerHook(DefaultCustomDictConfiguration()))
helpers.RegisterMapstructureUnmarshallerHook(
helpers.DefaultValuesUnmarshallerHook(DefaultCustomDictKeyConfiguration()))
helpers.RegisterMapstructureUnmarshallerHook(
helpers.DefaultValuesUnmarshallerHook(DefaultCustomDictAttributeConfiguration()))
}