a77b518542
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.
97 lines
2.2 KiB
Go
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",
|
|
})
|
|
|
|
}
|