github.com/muhammadn/cortex@v1.9.1-0.20220510110439-46bb7000d03d/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/pkg/rulefmt" 13 promRules "github.com/prometheus/prometheus/rules" 14 "github.com/stretchr/testify/require" 15 "gopkg.in/yaml.v3" 16 17 "github.com/cortexproject/cortex/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, err := ioutil.TempDir("", "") 28 require.NoError(t, err) 29 defer os.RemoveAll(dir) 30 31 ruleGroups := rulefmt.RuleGroups{ 32 Groups: []rulefmt.RuleGroup{ 33 { 34 Name: "rule", 35 Interval: model.Duration(100 * time.Second), 36 Rules: []rulefmt.RuleNode{ 37 { 38 Record: yaml.Node{Kind: yaml.ScalarNode, Value: "test_rule"}, 39 Expr: yaml.Node{Kind: yaml.ScalarNode, Value: "up"}, 40 }, 41 }, 42 }, 43 }, 44 } 45 46 b, err := yaml.Marshal(ruleGroups) 47 require.NoError(t, err) 48 49 err = os.MkdirAll(path.Join(dir, user1), 0777) 50 require.NoError(t, err) 51 52 // Link second user to first. 53 err = os.Symlink(user1, path.Join(dir, user2)) 54 require.NoError(t, err) 55 56 err = ioutil.WriteFile(path.Join(dir, user1, namespace1), b, 0777) 57 require.NoError(t, err) 58 59 const ignoredDir = "ignored-dir" 60 err = os.Mkdir(path.Join(dir, user1, ignoredDir), os.ModeDir|0644) 61 require.NoError(t, err) 62 63 err = os.Symlink(ignoredDir, path.Join(dir, user1, "link-to-dir")) 64 require.NoError(t, err) 65 66 // Link second namespace to first. 67 err = os.Symlink(namespace1, path.Join(dir, user1, namespace2)) 68 require.NoError(t, err) 69 70 client, err := NewLocalRulesClient(Config{ 71 Directory: dir, 72 }, promRules.FileLoader{}) 73 require.NoError(t, err) 74 75 ctx := context.Background() 76 userMap, err := client.ListAllRuleGroups(ctx) // Client loads rules in its List method. 77 require.NoError(t, err) 78 79 for _, u := range []string{user1, user2} { 80 actual, found := userMap[u] 81 require.True(t, found) 82 83 require.Equal(t, 2, len(actual)) 84 // We rely on the fact that files are parsed in alphabetical order, and our namespace1 < namespace2. 85 require.Equal(t, rulespb.ToProto(u, namespace1, ruleGroups.Groups[0]), actual[0]) 86 require.Equal(t, rulespb.ToProto(u, namespace2, ruleGroups.Groups[0]), actual[1]) 87 } 88 }