Path: blob/main/component/mimir/rules/kubernetes/diff.go
4096 views
package rules12import (3"bytes"45"github.com/prometheus/prometheus/model/rulefmt"6"gopkg.in/yaml.v3" // Used for prometheus rulefmt compatibility instead of gopkg.in/yaml.v27)89type ruleGroupDiffKind string1011const (12ruleGroupDiffKindAdd ruleGroupDiffKind = "add"13ruleGroupDiffKindRemove ruleGroupDiffKind = "remove"14ruleGroupDiffKindUpdate ruleGroupDiffKind = "update"15)1617type ruleGroupDiff struct {18Kind ruleGroupDiffKind19Actual rulefmt.RuleGroup20Desired rulefmt.RuleGroup21}2223type ruleGroupsByNamespace map[string][]rulefmt.RuleGroup24type ruleGroupDiffsByNamespace map[string][]ruleGroupDiff2526func diffRuleState(desired, actual ruleGroupsByNamespace) ruleGroupDiffsByNamespace {27seenNamespaces := map[string]bool{}2829diff := make(ruleGroupDiffsByNamespace)3031for namespace, desiredRuleGroups := range desired {32seenNamespaces[namespace] = true3334actualRuleGroups := actual[namespace]35subDiff := diffRuleNamespaceState(desiredRuleGroups, actualRuleGroups)3637if len(subDiff) == 0 {38continue39}4041diff[namespace] = subDiff42}4344for namespace, actualRuleGroups := range actual {45if seenNamespaces[namespace] {46continue47}4849subDiff := diffRuleNamespaceState(nil, actualRuleGroups)5051diff[namespace] = subDiff52}5354return diff55}5657func diffRuleNamespaceState(desired []rulefmt.RuleGroup, actual []rulefmt.RuleGroup) []ruleGroupDiff {58var diff []ruleGroupDiff5960seenGroups := map[string]bool{}6162desiredGroups:63for _, desiredRuleGroup := range desired {64seenGroups[desiredRuleGroup.Name] = true6566for _, actualRuleGroup := range actual {67if desiredRuleGroup.Name == actualRuleGroup.Name {68if equalRuleGroups(desiredRuleGroup, actualRuleGroup) {69continue desiredGroups70}7172diff = append(diff, ruleGroupDiff{73Kind: ruleGroupDiffKindUpdate,74Actual: actualRuleGroup,75Desired: desiredRuleGroup,76})77continue desiredGroups78}79}8081diff = append(diff, ruleGroupDiff{82Kind: ruleGroupDiffKindAdd,83Desired: desiredRuleGroup,84})85}8687for _, actualRuleGroup := range actual {88if seenGroups[actualRuleGroup.Name] {89continue90}9192diff = append(diff, ruleGroupDiff{93Kind: ruleGroupDiffKindRemove,94Actual: actualRuleGroup,95})96}9798return diff99}100101func equalRuleGroups(a, b rulefmt.RuleGroup) bool {102aBuf, err := yaml.Marshal(a)103if err != nil {104return false105}106bBuf, err := yaml.Marshal(b)107if err != nil {108return false109}110111return bytes.Equal(aBuf, bBuf)112}113114115