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  }