diff --git a/agent/consul/state/schema_test.go b/agent/consul/state/schema_test.go index 366647791e..0afce7b218 100644 --- a/agent/consul/state/schema_test.go +++ b/agent/consul/state/schema_test.go @@ -1,111 +1,12 @@ package state import ( - "bytes" - "fmt" - "reflect" - "runtime" - "sort" "testing" "github.com/hashicorp/go-memdb" "github.com/stretchr/testify/require" - - "github.com/hashicorp/consul/internal/testing/golden" ) -// TODO: once TestNewDBSchema_Indexers has test cases for all tables and indexes -// it is probably safe to remove this test -func TestNewDBSchema(t *testing.T) { - schema := newDBSchema() - require.NoError(t, schema.Validate()) - - _, err := memdb.NewMemDB(schema) - require.NoError(t, err) - - actual, err := repr(schema) - require.NoError(t, err) - - expected := golden.Get(t, actual, stateStoreSchemaExpected) - require.Equal(t, expected, actual) -} - -func repr(schema *memdb.DBSchema) (string, error) { - tables := make([]string, 0, len(schema.Tables)) - for name := range schema.Tables { - tables = append(tables, name) - } - sort.Strings(tables) - - buf := new(bytes.Buffer) - for _, name := range tables { - fmt.Fprintf(buf, "table=%v\n", name) - - indexes := indexNames(schema.Tables[name]) - for _, i := range indexes { - index := schema.Tables[name].Indexes[i] - fmt.Fprintf(buf, " index=%v", i) - if index.Unique { - buf.WriteString(" unique") - } - if index.AllowMissing { - buf.WriteString(" allow-missing") - } - buf.WriteString("\n") - buf.WriteString(" indexer=") - formatIndexer(buf, index.Indexer) - buf.WriteString("\n") - } - buf.WriteString("\n") - } - - return buf.String(), nil -} - -func formatIndexer(buf *bytes.Buffer, indexer memdb.Indexer) { - v := reflect.Indirect(reflect.ValueOf(indexer)) - typ := v.Type() - buf.WriteString(typ.PkgPath() + "." + typ.Name()) - for i := 0; i < typ.NumField(); i++ { - fmt.Fprintf(buf, " %v=", typ.Field(i).Name) - - formatField(buf, v.Field(i)) - } -} - -func formatField(buf *bytes.Buffer, field reflect.Value) { - switch field.Type().Kind() { - case reflect.Slice: - buf.WriteString("[") - for j := 0; j < field.Len(); j++ { - if j != 0 { - buf.WriteString(", ") - } - // TODO: handle other types of slices - formatIndexer(buf, field.Index(j).Interface().(memdb.Indexer)) - } - buf.WriteString("]") - case reflect.Func: - // Functions are printed as pointer addresses, which change frequently. - // Instead use the name. - buf.WriteString(runtime.FuncForPC(field.Pointer()).Name()) - case reflect.Interface: - formatField(buf, field.Elem()) - default: - fmt.Fprintf(buf, "%v", field) - } -} - -func indexNames(table *memdb.TableSchema) []string { - indexes := make([]string, 0, len(table.Indexes)) - for name := range table.Indexes { - indexes = append(indexes, name) - } - - sort.Strings(indexes) - return indexes -} - type indexerTestCase struct { read indexValue write indexValue diff --git a/agent/consul/state/testdata/TestStateStoreSchema.golden b/agent/consul/state/testdata/TestStateStoreSchema.golden deleted file mode 100644 index 73c6bb4ed5..0000000000 --- a/agent/consul/state/testdata/TestStateStoreSchema.golden +++ /dev/null @@ -1,186 +0,0 @@ -table=acl-auth-methods - index=id unique - indexer=github.com/hashicorp/go-memdb.StringFieldIndex Field=Name Lowercase=true - -table=acl-binding-rules - index=authmethod - indexer=github.com/hashicorp/go-memdb.StringFieldIndex Field=AuthMethod Lowercase=true - index=id unique - indexer=github.com/hashicorp/go-memdb.UUIDFieldIndex Field=ID - -table=acl-policies - index=id unique - indexer=github.com/hashicorp/go-memdb.UUIDFieldIndex Field=ID - index=name unique - indexer=github.com/hashicorp/consul/agent/consul/state.indexerSingleWithPrefix readIndex=github.com/hashicorp/consul/agent/consul/state.indexFromQuery writeIndex=github.com/hashicorp/consul/agent/consul/state.indexNameFromACLPolicy prefixIndex=github.com/hashicorp/consul/agent/consul/state.prefixIndexFromQuery - -table=acl-roles - index=id unique - indexer=github.com/hashicorp/go-memdb.UUIDFieldIndex Field=ID - index=name unique - indexer=github.com/hashicorp/consul/agent/consul/state.indexerSingleWithPrefix readIndex=github.com/hashicorp/consul/agent/consul/state.indexFromQuery writeIndex=github.com/hashicorp/consul/agent/consul/state.indexNameFromACLRole prefixIndex=github.com/hashicorp/consul/agent/consul/state.prefixIndexFromQuery - index=policies allow-missing - indexer=github.com/hashicorp/consul/agent/consul/state.indexerMulti readIndex=github.com/hashicorp/consul/agent/consul/state.indexFromUUIDQuery writeIndexMulti=github.com/hashicorp/consul/agent/consul/state.multiIndexPolicyFromACLRole - -table=acl-tokens - index=accessor unique allow-missing - indexer=github.com/hashicorp/go-memdb.UUIDFieldIndex Field=AccessorID - index=authmethod allow-missing - indexer=github.com/hashicorp/go-memdb.StringFieldIndex Field=AuthMethod Lowercase=false - index=expires-global allow-missing - indexer=github.com/hashicorp/consul/agent/consul/state.TokenExpirationIndex LocalFilter=false - index=expires-local allow-missing - indexer=github.com/hashicorp/consul/agent/consul/state.TokenExpirationIndex LocalFilter=true - index=id unique - indexer=github.com/hashicorp/go-memdb.StringFieldIndex Field=SecretID Lowercase=false - index=local - indexer=github.com/hashicorp/go-memdb.ConditionalIndex Conditional=github.com/hashicorp/consul/agent/consul/state.tokensTableSchema.func1 - index=needs-upgrade - indexer=github.com/hashicorp/go-memdb.ConditionalIndex Conditional=github.com/hashicorp/consul/agent/consul/state.tokensTableSchema.func2 - index=policies allow-missing - indexer=github.com/hashicorp/consul/agent/consul/state.TokenPoliciesIndex - index=roles allow-missing - indexer=github.com/hashicorp/consul/agent/consul/state.TokenRolesIndex - -table=autopilot-config - index=id unique allow-missing - indexer=github.com/hashicorp/go-memdb.ConditionalIndex Conditional=github.com/hashicorp/consul/agent/consul/state.autopilotConfigTableSchema.func1 - -table=checks - index=id unique - indexer=github.com/hashicorp/consul/agent/consul/state.indexerSingleWithPrefix readIndex=github.com/hashicorp/consul/agent/consul/state.indexFromNodeCheckID writeIndex=github.com/hashicorp/consul/agent/consul/state.indexFromHealthCheck prefixIndex=github.com/hashicorp/consul/agent/consul/state.prefixIndexFromQuery - index=node allow-missing - indexer=github.com/hashicorp/consul/agent/consul/state.indexerSingle readIndex=github.com/hashicorp/consul/agent/consul/state.indexFromNodeQuery writeIndex=github.com/hashicorp/consul/agent/consul/state.indexFromNodeIdentity - index=node_service allow-missing - indexer=github.com/hashicorp/consul/agent/consul/state.indexerSingle readIndex=github.com/hashicorp/consul/agent/consul/state.indexFromNodeServiceQuery writeIndex=github.com/hashicorp/consul/agent/consul/state.indexNodeServiceFromHealthCheck - index=service allow-missing - indexer=github.com/hashicorp/go-memdb.StringFieldIndex Field=ServiceName Lowercase=true - index=status - indexer=github.com/hashicorp/go-memdb.StringFieldIndex Field=Status Lowercase=false - -table=config-entries - index=id unique - indexer=github.com/hashicorp/consul/agent/consul/state.indexerSingleWithPrefix readIndex=github.com/hashicorp/consul/agent/consul/state.indexFromConfigEntryKindName writeIndex=github.com/hashicorp/consul/agent/consul/state.indexFromConfigEntry prefixIndex=github.com/hashicorp/consul/agent/consul/state.indexFromConfigEntryKindName - index=intention-legacy-id unique allow-missing - indexer=github.com/hashicorp/consul/agent/consul/state.ServiceIntentionLegacyIDIndex uuidFieldIndex={} - index=intention-source allow-missing - indexer=github.com/hashicorp/consul/agent/consul/state.ServiceIntentionSourceIndex - index=kind - indexer=github.com/hashicorp/consul/agent/consul/state.indexerSingle readIndex=github.com/hashicorp/consul/agent/consul/state.indexFromConfigEntryKindQuery writeIndex=github.com/hashicorp/consul/agent/consul/state.indexKindFromConfigEntry - index=link allow-missing - indexer=github.com/hashicorp/consul/agent/consul/state.ConfigEntryLinkIndex - -table=connect-ca-builtin - index=id unique - indexer=github.com/hashicorp/go-memdb.StringFieldIndex Field=ID Lowercase=false - -table=connect-ca-config - index=id unique allow-missing - indexer=github.com/hashicorp/go-memdb.ConditionalIndex Conditional=github.com/hashicorp/consul/agent/consul/state.caConfigTableSchema.func1 - -table=connect-ca-roots - index=id unique - indexer=github.com/hashicorp/go-memdb.StringFieldIndex Field=ID Lowercase=false - -table=connect-intentions - index=destination allow-missing - indexer=github.com/hashicorp/go-memdb.CompoundIndex Indexes=[github.com/hashicorp/go-memdb.StringFieldIndex Field=DestinationNS Lowercase=true, github.com/hashicorp/go-memdb.StringFieldIndex Field=DestinationName Lowercase=true] AllowMissing=false - index=id unique - indexer=github.com/hashicorp/go-memdb.UUIDFieldIndex Field=ID - index=source allow-missing - indexer=github.com/hashicorp/go-memdb.CompoundIndex Indexes=[github.com/hashicorp/go-memdb.StringFieldIndex Field=SourceNS Lowercase=true, github.com/hashicorp/go-memdb.StringFieldIndex Field=SourceName Lowercase=true] AllowMissing=false - index=source_destination unique allow-missing - indexer=github.com/hashicorp/go-memdb.CompoundIndex Indexes=[github.com/hashicorp/go-memdb.StringFieldIndex Field=SourceNS Lowercase=true, github.com/hashicorp/go-memdb.StringFieldIndex Field=SourceName Lowercase=true, github.com/hashicorp/go-memdb.StringFieldIndex Field=DestinationNS Lowercase=true, github.com/hashicorp/go-memdb.StringFieldIndex Field=DestinationName Lowercase=true] AllowMissing=false - -table=coordinates - index=id unique - indexer=github.com/hashicorp/go-memdb.CompoundIndex Indexes=[github.com/hashicorp/go-memdb.StringFieldIndex Field=Node Lowercase=true, github.com/hashicorp/go-memdb.StringFieldIndex Field=Segment Lowercase=true] AllowMissing=true - index=node - indexer=github.com/hashicorp/go-memdb.StringFieldIndex Field=Node Lowercase=true - -table=federation-states - index=id unique - indexer=github.com/hashicorp/go-memdb.StringFieldIndex Field=Datacenter Lowercase=true - -table=gateway-services - index=gateway - indexer=github.com/hashicorp/consul/agent/consul/state.ServiceNameIndex Field=Gateway - index=id unique - indexer=github.com/hashicorp/go-memdb.CompoundIndex Indexes=[github.com/hashicorp/consul/agent/consul/state.ServiceNameIndex Field=Gateway, github.com/hashicorp/consul/agent/consul/state.ServiceNameIndex Field=Service, github.com/hashicorp/go-memdb.IntFieldIndex Field=Port] AllowMissing=false - index=service allow-missing - indexer=github.com/hashicorp/consul/agent/consul/state.ServiceNameIndex Field=Service - -table=index - index=id unique - indexer=github.com/hashicorp/go-memdb.StringFieldIndex Field=Key Lowercase=true - -table=kvs - index=id unique - indexer=github.com/hashicorp/go-memdb.StringFieldIndex Field=Key Lowercase=false - index=session allow-missing - indexer=github.com/hashicorp/go-memdb.UUIDFieldIndex Field=Session - -table=mesh-topology - index=downstream - indexer=github.com/hashicorp/consul/agent/consul/state.ServiceNameIndex Field=Downstream - index=id unique - indexer=github.com/hashicorp/go-memdb.CompoundIndex Indexes=[github.com/hashicorp/consul/agent/consul/state.ServiceNameIndex Field=Upstream, github.com/hashicorp/consul/agent/consul/state.ServiceNameIndex Field=Downstream] AllowMissing=false - index=upstream allow-missing - indexer=github.com/hashicorp/consul/agent/consul/state.ServiceNameIndex Field=Upstream - -table=nodes - index=id unique - indexer=github.com/hashicorp/consul/agent/consul/state.indexerSingle readIndex=github.com/hashicorp/consul/agent/consul/state.indexFromNodeQuery writeIndex=github.com/hashicorp/consul/agent/consul/state.indexFromNode - index=meta allow-missing - indexer=github.com/hashicorp/go-memdb.StringMapFieldIndex Field=Meta Lowercase=false - index=uuid unique allow-missing - indexer=github.com/hashicorp/go-memdb.UUIDFieldIndex Field=ID - -table=prepared-queries - index=id unique - indexer=github.com/hashicorp/go-memdb.UUIDFieldIndex Field=ID - index=name unique allow-missing - indexer=github.com/hashicorp/go-memdb.StringFieldIndex Field=Name Lowercase=true - index=session allow-missing - indexer=github.com/hashicorp/go-memdb.UUIDFieldIndex Field=Session - index=template unique allow-missing - indexer=github.com/hashicorp/consul/agent/consul/state.PreparedQueryIndex - -table=services - index=connect allow-missing - indexer=github.com/hashicorp/consul/agent/consul/state.IndexConnectService - index=id unique - indexer=github.com/hashicorp/consul/agent/consul/state.indexerSingleWithPrefix readIndex=github.com/hashicorp/consul/agent/consul/state.indexFromNodeServiceQuery writeIndex=github.com/hashicorp/consul/agent/consul/state.indexFromServiceNode prefixIndex=github.com/hashicorp/consul/agent/consul/state.prefixIndexFromQuery - index=kind - indexer=github.com/hashicorp/consul/agent/consul/state.IndexServiceKind - index=node - indexer=github.com/hashicorp/consul/agent/consul/state.indexerSingle readIndex=github.com/hashicorp/consul/agent/consul/state.indexFromNodeQuery writeIndex=github.com/hashicorp/consul/agent/consul/state.indexFromNodeIdentity - index=service allow-missing - indexer=github.com/hashicorp/go-memdb.StringFieldIndex Field=ServiceName Lowercase=true - -table=session_checks - index=id unique - indexer=github.com/hashicorp/go-memdb.CompoundIndex Indexes=[github.com/hashicorp/go-memdb.StringFieldIndex Field=Node Lowercase=true, github.com/hashicorp/consul/agent/consul/state.CheckIDIndex, github.com/hashicorp/go-memdb.UUIDFieldIndex Field=Session] AllowMissing=false - index=node_check - indexer=github.com/hashicorp/go-memdb.CompoundIndex Indexes=[github.com/hashicorp/go-memdb.StringFieldIndex Field=Node Lowercase=true, github.com/hashicorp/consul/agent/consul/state.CheckIDIndex] AllowMissing=false - index=session - indexer=github.com/hashicorp/go-memdb.UUIDFieldIndex Field=Session - -table=sessions - index=id unique - indexer=github.com/hashicorp/go-memdb.UUIDFieldIndex Field=ID - index=node - indexer=github.com/hashicorp/go-memdb.StringFieldIndex Field=Node Lowercase=true - -table=system-metadata - index=id unique - indexer=github.com/hashicorp/go-memdb.StringFieldIndex Field=Key Lowercase=true - -table=tombstones - index=id unique - indexer=github.com/hashicorp/go-memdb.StringFieldIndex Field=Key Lowercase=false - -table=usage - index=id unique - indexer=github.com/hashicorp/go-memdb.StringFieldIndex Field=ID Lowercase=true -