-
Notifications
You must be signed in to change notification settings - Fork 345
/
defaultfilters.go
88 lines (70 loc) · 1.89 KB
/
defaultfilters.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package kubernetes
import (
"fmt"
"os"
"path/filepath"
"strings"
log "github.com/sirupsen/logrus"
"github.com/zalando/skipper/dataclients/kubernetes/definitions"
"github.com/zalando/skipper/eskip"
)
type filterSet struct {
text string
filters []*eskip.Filter
parsed bool
err error
}
type defaultFilters map[definitions.ResourceID]*filterSet
func readDefaultFilters(dir string) (defaultFilters, error) {
files, err := os.ReadDir(dir)
if err != nil {
return nil, err
}
filters := make(defaultFilters)
for _, f := range files {
r := strings.Split(f.Name(), ".") // format: {service}.{namespace}
if len(r) != 2 {
log.WithField("file", f.Name()).Debug("malformed file name")
continue
}
info, err := f.Info()
if err != nil || !(f.Type().IsRegular() || f.Type()&os.ModeSymlink != 0) || info.Size() > maxFileSize {
log.WithError(err).WithField("file", f.Name()).Debug("incompatible file")
continue
}
file := filepath.Join(dir, f.Name())
config, err := os.ReadFile(file)
if err != nil {
log.WithError(err).WithField("file", file).Debug("could not read file")
continue
}
filters[definitions.ResourceID{Name: r[0], Namespace: r[1]}] = &filterSet{text: string(config)}
}
return filters, nil
}
func (fs *filterSet) parse() {
if fs.parsed {
return
}
fs.filters, fs.err = eskip.ParseFilters(fs.text)
if fs.err != nil {
fs.err = fmt.Errorf("[eskip] default filters: %w", fs.err)
}
fs.parsed = true
}
func (df defaultFilters) get(serviceID definitions.ResourceID) ([]*eskip.Filter, error) {
fs, ok := df[serviceID]
if !ok {
return nil, nil
}
fs.parse()
if fs.err != nil {
return nil, fs.err
}
f := make([]*eskip.Filter, len(fs.filters))
copy(f, fs.filters)
return f, nil
}
func (df defaultFilters) getNamed(namespace, serviceName string) ([]*eskip.Filter, error) {
return df.get(definitions.ResourceID{Namespace: namespace, Name: serviceName})
}