Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/component/mimir/rules/kubernetes/diff.go
4096 views
1
package rules
2
3
import (
4
"bytes"
5
6
"github.com/prometheus/prometheus/model/rulefmt"
7
"gopkg.in/yaml.v3" // Used for prometheus rulefmt compatibility instead of gopkg.in/yaml.v2
8
)
9
10
type ruleGroupDiffKind string
11
12
const (
13
ruleGroupDiffKindAdd ruleGroupDiffKind = "add"
14
ruleGroupDiffKindRemove ruleGroupDiffKind = "remove"
15
ruleGroupDiffKindUpdate ruleGroupDiffKind = "update"
16
)
17
18
type ruleGroupDiff struct {
19
Kind ruleGroupDiffKind
20
Actual rulefmt.RuleGroup
21
Desired rulefmt.RuleGroup
22
}
23
24
type ruleGroupsByNamespace map[string][]rulefmt.RuleGroup
25
type ruleGroupDiffsByNamespace map[string][]ruleGroupDiff
26
27
func diffRuleState(desired, actual ruleGroupsByNamespace) ruleGroupDiffsByNamespace {
28
seenNamespaces := map[string]bool{}
29
30
diff := make(ruleGroupDiffsByNamespace)
31
32
for namespace, desiredRuleGroups := range desired {
33
seenNamespaces[namespace] = true
34
35
actualRuleGroups := actual[namespace]
36
subDiff := diffRuleNamespaceState(desiredRuleGroups, actualRuleGroups)
37
38
if len(subDiff) == 0 {
39
continue
40
}
41
42
diff[namespace] = subDiff
43
}
44
45
for namespace, actualRuleGroups := range actual {
46
if seenNamespaces[namespace] {
47
continue
48
}
49
50
subDiff := diffRuleNamespaceState(nil, actualRuleGroups)
51
52
diff[namespace] = subDiff
53
}
54
55
return diff
56
}
57
58
func diffRuleNamespaceState(desired []rulefmt.RuleGroup, actual []rulefmt.RuleGroup) []ruleGroupDiff {
59
var diff []ruleGroupDiff
60
61
seenGroups := map[string]bool{}
62
63
desiredGroups:
64
for _, desiredRuleGroup := range desired {
65
seenGroups[desiredRuleGroup.Name] = true
66
67
for _, actualRuleGroup := range actual {
68
if desiredRuleGroup.Name == actualRuleGroup.Name {
69
if equalRuleGroups(desiredRuleGroup, actualRuleGroup) {
70
continue desiredGroups
71
}
72
73
diff = append(diff, ruleGroupDiff{
74
Kind: ruleGroupDiffKindUpdate,
75
Actual: actualRuleGroup,
76
Desired: desiredRuleGroup,
77
})
78
continue desiredGroups
79
}
80
}
81
82
diff = append(diff, ruleGroupDiff{
83
Kind: ruleGroupDiffKindAdd,
84
Desired: desiredRuleGroup,
85
})
86
}
87
88
for _, actualRuleGroup := range actual {
89
if seenGroups[actualRuleGroup.Name] {
90
continue
91
}
92
93
diff = append(diff, ruleGroupDiff{
94
Kind: ruleGroupDiffKindRemove,
95
Actual: actualRuleGroup,
96
})
97
}
98
99
return diff
100
}
101
102
func equalRuleGroups(a, b rulefmt.RuleGroup) bool {
103
aBuf, err := yaml.Marshal(a)
104
if err != nil {
105
return false
106
}
107
bBuf, err := yaml.Marshal(b)
108
if err != nil {
109
return false
110
}
111
112
return bytes.Equal(aBuf, bBuf)
113
}
114
115