github.com/yankunsam/loki/v2@v2.6.3-0.20220817130409-389df5235c27/pkg/ruler/rulestore/local/local_test.go (about) 1 package local 2 3 import ( 4 "context" 5 "io/ioutil" 6 "os" 7 "path" 8 "testing" 9 "time" 10 11 "github.com/prometheus/common/model" 12 "github.com/prometheus/prometheus/model/rulefmt" 13 promRules "github.com/prometheus/prometheus/rules" 14 "github.com/stretchr/testify/require" 15 "gopkg.in/yaml.v3" 16 17 "github.com/grafana/loki/pkg/ruler/rulespb" 18 ) 19 20 func TestClient_LoadAllRuleGroups(t *testing.T) { 21 user1 := "user" 22 user2 := "second-user" 23 24 namespace1 := "ns" 25 namespace2 := "z-another" // This test relies on the fact that ioutil.ReadDir() returns files sorted by name. 26 27 dir := t.TempDir() 28 29 ruleGroups := rulefmt.RuleGroups{ 30 Groups: []rulefmt.RuleGroup{ 31 { 32 Name: "rule", 33 Interval: model.Duration(100 * time.Second), 34 Rules: []rulefmt.RuleNode{ 35 { 36 Record: yaml.Node{Kind: yaml.ScalarNode, Value: "test_rule"}, 37 Expr: yaml.Node{Kind: yaml.ScalarNode, Value: "up"}, 38 }, 39 }, 40 }, 41 }, 42 } 43 44 b, err := yaml.Marshal(ruleGroups) 45 require.NoError(t, err) 46 47 err = os.MkdirAll(path.Join(dir, user1), 0777) 48 require.NoError(t, err) 49 50 // Link second user to first. 51 err = os.Symlink(user1, path.Join(dir, user2)) 52 require.NoError(t, err) 53 54 err = ioutil.WriteFile(path.Join(dir, user1, namespace1), b, 0777) 55 require.NoError(t, err) 56 57 const ignoredDir = "ignored-dir" 58 err = os.Mkdir(path.Join(dir, user1, ignoredDir), os.ModeDir|0644) 59 require.NoError(t, err) 60 61 err = os.Symlink(ignoredDir, path.Join(dir, user1, "link-to-dir")) 62 require.NoError(t, err) 63 64 // Link second namespace to first. 65 err = os.Symlink(namespace1, path.Join(dir, user1, namespace2)) 66 require.NoError(t, err) 67 68 client, err := NewLocalRulesClient(Config{ 69 Directory: dir, 70 }, promRules.FileLoader{}) 71 require.NoError(t, err) 72 73 ctx := context.Background() 74 userMap, err := client.ListAllRuleGroups(ctx) // Client loads rules in its List method. 75 require.NoError(t, err) 76 77 for _, u := range []string{user1, user2} { 78 actual, found := userMap[u] 79 require.True(t, found) 80 81 require.Equal(t, 2, len(actual)) 82 // We rely on the fact that files are parsed in alphabetical order, and our namespace1 < namespace2. 83 require.Equal(t, rulespb.ToProto(u, namespace1, ruleGroups.Groups[0]), actual[0]) 84 require.Equal(t, rulespb.ToProto(u, namespace2, ruleGroups.Groups[0]), actual[1]) 85 } 86 }