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  }