diff --git a/consul/state/schema.go b/consul/state/schema.go index 8aa920a4c..998d061e7 100644 --- a/consul/state/schema.go +++ b/consul/state/schema.go @@ -21,6 +21,14 @@ func stateStoreSchema() *memdb.DBSchema { // Collect the needed schemas schemas := []schemaFn{ indexTableSchema, + nodesTableSchema, + servicesTableSchema, + checksTableSchema, + kvsTableSchema, + tombstonesTableSchema, + sessionsTableSchema, + sessionChecksTableSchema, + aclsTableSchema, } // Add the tables to the root schema @@ -52,3 +60,229 @@ func indexTableSchema() *memdb.TableSchema { }, } } + +// nodesTableSchema returns a new table schema used for +// storing node information. +func nodesTableSchema() *memdb.TableSchema { + return &memdb.TableSchema{ + Name: "nodes", + Indexes: map[string]*memdb.IndexSchema{ + "id": &memdb.IndexSchema{ + AllowMissing: false, + Unique: true, + Indexer: &memdb.StringFieldIndex{ + Field: "Node", + Lowercase: true, + }, + }, + }, + } +} + +// servicesTableSchema returns a new TableSchema used to +// store information about services. +func servicesTableSchema() *memdb.TableSchema { + return &memdb.TableSchema{ + Name: "services", + Indexes: map[string]*memdb.IndexSchema{ + "id": &memdb.IndexSchema{ + AllowMissing: false, + Unique: true, + Indexer: &memdb.StringFieldIndex{ + Field: "ServiceID", + Lowercase: true, + }, + }, + "service": &memdb.IndexSchema{ + AllowMissing: true, + Unique: false, + Indexer: &memdb.StringFieldIndex{ + Field: "ServiceName", + Lowercase: true, + }, + }, + }, + } +} + +// checksTableSchema returns a new table schema used for +// storing and indexing health check information. Health +// checks have a number of different attributes we want to +// filter by, so this table is a bit more complex. +func checksTableSchema() *memdb.TableSchema { + return &memdb.TableSchema{ + Name: "checks", + Indexes: map[string]*memdb.IndexSchema{ + "id": &memdb.IndexSchema{ + AllowMissing: false, + Unique: true, + Indexer: &memdb.CompoundIndex{ + Indexes: []memdb.Indexer{ + &memdb.StringFieldIndex{ + Field: "Node", + Lowercase: true, + }, + &memdb.StringFieldIndex{ + Field: "CheckID", + Lowercase: true, + }, + }, + }, + }, + "status": &memdb.IndexSchema{ + AllowMissing: false, + Unique: false, + Indexer: &memdb.StringFieldIndex{ + Field: "Status", + Lowercase: false, + }, + }, + "service": &memdb.IndexSchema{ + AllowMissing: true, + Unique: false, + Indexer: &memdb.StringFieldIndex{ + Field: "ServiceName", + Lowercase: true, + }, + }, + "node": &memdb.IndexSchema{ + AllowMissing: true, + Unique: false, + Indexer: &memdb.CompoundIndex{ + Indexes: []memdb.Indexer{ + &memdb.StringFieldIndex{ + Field: "Node", + Lowercase: true, + }, + &memdb.StringFieldIndex{ + Field: "ServiceID", + Lowercase: true, + }, + }, + }, + }, + }, + } +} + +// kvsTableSchema returns a new table schema used for storing +// key/value data from consul's kv store. +// +// TODO(ryanuber): I don't *think* we need an id_prefix, since +// StringFieldIndex implements PrefixIndexer. +func kvsTableSchema() *memdb.TableSchema { + return &memdb.TableSchema{ + Name: "kvs", + Indexes: map[string]*memdb.IndexSchema{ + "id": &memdb.IndexSchema{ + AllowMissing: false, + Unique: true, + Indexer: &memdb.StringFieldIndex{ + Field: "Key", + Lowercase: false, + }, + }, + "session": &memdb.IndexSchema{ + AllowMissing: true, + Unique: false, + Indexer: &memdb.StringFieldIndex{ + Field: "Session", + Lowercase: false, + }, + }, + }, + } +} + +// tombstonesTableSchema returns a new table schema used for +// storing tombstones during kvs delete operations to prevent +// the index from sliding backwards. +func tombstonesTableSchema() *memdb.TableSchema { + return &memdb.TableSchema{ + Name: "tombstones", + Indexes: map[string]*memdb.IndexSchema{ + "id": &memdb.IndexSchema{ + AllowMissing: false, + Unique: true, + Indexer: &memdb.StringFieldIndex{ + Field: "Key", + Lowercase: false, + }, + }, + }, + } +} + +// sessionsTableSchema returns a new TableSchema used for +// storing session information. +func sessionsTableSchema() *memdb.TableSchema { + return &memdb.TableSchema{ + Name: "sessions", + Indexes: map[string]*memdb.IndexSchema{ + "id": &memdb.IndexSchema{ + AllowMissing: false, + Unique: true, + Indexer: &memdb.StringFieldIndex{ + Field: "ID", + Lowercase: false, + }, + }, + "node": &memdb.IndexSchema{ + AllowMissing: true, + Unique: false, + Indexer: &memdb.StringFieldIndex{ + Field: "Node", + Lowercase: true, + }, + }, + }, + } +} + +// sessionChecksTableSchema returns a new table schema used +// for storing session checks. +func sessionChecksTableSchema() *memdb.TableSchema { + return &memdb.TableSchema{ + Name: "session_checks", + Indexes: map[string]*memdb.IndexSchema{ + "id": &memdb.IndexSchema{ + AllowMissing: false, + Unique: true, + Indexer: &memdb.CompoundIndex{ + Indexes: []memdb.Indexer{ + &memdb.StringFieldIndex{ + Field: "Node", + Lowercase: true, + }, + &memdb.StringFieldIndex{ + Field: "CheckID", + Lowercase: true, + }, + &memdb.StringFieldIndex{ + Field: "Session", + Lowercase: false, + }, + }, + }, + }, + }, + } +} + +// aclsTableSchema returns a new table schema used for +// storing ACL information. +func aclsTableSchema() *memdb.TableSchema { + return &memdb.TableSchema{ + Name: "acls", + Indexes: map[string]*memdb.IndexSchema{ + "id": &memdb.IndexSchema{ + AllowMissing: false, + Unique: true, + Indexer: &memdb.StringFieldIndex{ + Field: "ID", + Lowercase: false, + }, + }, + }, + } +}