open-consul/agent/consul/state/system_metadata_test.go
R.B. Boyer a77b518542
server: create new memdb table for storing system metadata (#8703)
This adds a new very tiny memdb table and corresponding raft operation
for updating a very small effective map[string]string collection of
"system metadata". This can persistently record a fact about the Consul
state machine itself.

The first use of this feature will come in a later PR.
2020-10-06 10:08:37 -05:00

97 lines
2.2 KiB
Go

package state
import (
"testing"
"github.com/hashicorp/consul/agent/structs"
"github.com/stretchr/testify/require"
)
func TestStore_SystemMetadata(t *testing.T) {
s := testStateStore(t)
mapify := func(entries []*structs.SystemMetadataEntry) map[string]string {
m := make(map[string]string)
for _, entry := range entries {
m[entry.Key] = entry.Value
}
return m
}
checkListAndGet := func(t *testing.T, expect map[string]string) {
// List all
_, entries, err := s.SystemMetadataList(nil)
require.NoError(t, err)
require.Len(t, entries, len(expect))
require.Equal(t, expect, mapify(entries))
// Read each
for expectKey, expectVal := range expect {
_, entry, err := s.SystemMetadataGet(nil, expectKey)
require.NoError(t, err)
require.NotNil(t, entry)
require.Equal(t, expectVal, entry.Value)
}
}
checkListAndGet(t, map[string]string{})
var nextIndex uint64
// Create 3 keys
nextIndex++
require.NoError(t, s.SystemMetadataSet(nextIndex, &structs.SystemMetadataEntry{
Key: "key1", Value: "val1",
}))
nextIndex++
require.NoError(t, s.SystemMetadataSet(nextIndex, &structs.SystemMetadataEntry{
Key: "key2", Value: "val2",
}))
nextIndex++
require.NoError(t, s.SystemMetadataSet(nextIndex, &structs.SystemMetadataEntry{
Key: "key3",
}))
checkListAndGet(t, map[string]string{
"key1": "val1",
"key2": "val2",
"key3": "",
})
// Missing results are nil
_, entry, err := s.SystemMetadataGet(nil, "key4")
require.NoError(t, err)
require.Nil(t, entry)
// Delete one that exists and one that does not
nextIndex++
require.NoError(t, s.SystemMetadataDelete(nextIndex, &structs.SystemMetadataEntry{
Key: "key2",
}))
nextIndex++
require.NoError(t, s.SystemMetadataDelete(nextIndex, &structs.SystemMetadataEntry{
Key: "key4",
}))
checkListAndGet(t, map[string]string{
"key1": "val1",
"key3": "",
})
// Update one that exists and add another one.
nextIndex++
require.NoError(t, s.SystemMetadataSet(nextIndex, &structs.SystemMetadataEntry{
Key: "key3", Value: "val3",
}))
require.NoError(t, s.SystemMetadataSet(nextIndex, &structs.SystemMetadataEntry{
Key: "key4", Value: "val4",
}))
checkListAndGet(t, map[string]string{
"key1": "val1",
"key3": "val3",
"key4": "val4",
})
}