Path: blob/main/component/mimir/rules/kubernetes/diff_test.go
4096 views
package rules12import (3"fmt"4"testing"56"github.com/prometheus/prometheus/model/rulefmt"7"github.com/stretchr/testify/require"8)910func parseRuleGroups(t *testing.T, buf []byte) []rulefmt.RuleGroup {11t.Helper()1213groups, errs := rulefmt.Parse(buf)14require.Empty(t, errs)1516return groups.Groups17}1819func TestDiffRuleState(t *testing.T) {20ruleGroupsA := parseRuleGroups(t, []byte(`21groups:22- name: rule-group-a23interval: 1m24rules:25- record: rule_a26expr: 127`))2829ruleGroupsAModified := parseRuleGroups(t, []byte(`30groups:31- name: rule-group-a32interval: 1m33rules:34- record: rule_a35expr: 336`))3738managedNamespace := "agent/namespace/name/12345678-1234-1234-1234-123456789012"3940type testCase struct {41name string42desired map[string][]rulefmt.RuleGroup43actual map[string][]rulefmt.RuleGroup44expected map[string][]ruleGroupDiff45}4647testCases := []testCase{48{49name: "empty sets",50desired: map[string][]rulefmt.RuleGroup{},51actual: map[string][]rulefmt.RuleGroup{},52expected: map[string][]ruleGroupDiff{},53},54{55name: "add rule group",56desired: map[string][]rulefmt.RuleGroup{57managedNamespace: ruleGroupsA,58},59actual: map[string][]rulefmt.RuleGroup{},60expected: map[string][]ruleGroupDiff{61managedNamespace: {62{63Kind: ruleGroupDiffKindAdd,64Desired: ruleGroupsA[0],65},66},67},68},69{70name: "remove rule group",71desired: map[string][]rulefmt.RuleGroup{},72actual: map[string][]rulefmt.RuleGroup{73managedNamespace: ruleGroupsA,74},75expected: map[string][]ruleGroupDiff{76managedNamespace: {77{78Kind: ruleGroupDiffKindRemove,79Actual: ruleGroupsA[0],80},81},82},83},84{85name: "update rule group",86desired: map[string][]rulefmt.RuleGroup{87managedNamespace: ruleGroupsA,88},89actual: map[string][]rulefmt.RuleGroup{90managedNamespace: ruleGroupsAModified,91},92expected: map[string][]ruleGroupDiff{93managedNamespace: {94{95Kind: ruleGroupDiffKindUpdate,96Desired: ruleGroupsA[0],97Actual: ruleGroupsAModified[0],98},99},100},101},102{103name: "unchanged rule groups",104desired: map[string][]rulefmt.RuleGroup{105managedNamespace: ruleGroupsA,106},107actual: map[string][]rulefmt.RuleGroup{108managedNamespace: ruleGroupsA,109},110expected: map[string][]ruleGroupDiff{},111},112}113114for _, tc := range testCases {115t.Run(tc.name, func(t *testing.T) {116actual := diffRuleState(tc.desired, tc.actual)117requireEqualRuleDiffs(t, tc.expected, actual)118})119}120}121122func requireEqualRuleDiffs(t *testing.T, expected, actual map[string][]ruleGroupDiff) {123require.Equal(t, len(expected), len(actual))124125var summarizeDiff = func(diff ruleGroupDiff) string {126switch diff.Kind {127case ruleGroupDiffKindAdd:128return fmt.Sprintf("add: %s", diff.Desired.Name)129case ruleGroupDiffKindRemove:130return fmt.Sprintf("remove: %s", diff.Actual.Name)131case ruleGroupDiffKindUpdate:132return fmt.Sprintf("update: %s", diff.Desired.Name)133}134panic("unreachable")135}136137for namespace, expectedDiffs := range expected {138actualDiffs, ok := actual[namespace]139require.True(t, ok)140141require.Equal(t, len(expectedDiffs), len(actualDiffs))142143for i, expectedDiff := range expectedDiffs {144actualDiff := actualDiffs[i]145146if expectedDiff.Kind != actualDiff.Kind ||147!equalRuleGroups(expectedDiff.Desired, actualDiff.Desired) ||148!equalRuleGroups(expectedDiff.Actual, actualDiff.Actual) {149150t.Logf("expected diff: %s", summarizeDiff(expectedDiff))151t.Logf("actual diff: %s", summarizeDiff(actualDiff))152t.Fail()153}154}155}156}157158159