Adding HealthCheck and an associated table

This commit is contained in:
Armon Dadgar 2014-01-08 11:21:29 -08:00
parent c40c2a9c1f
commit 266c6736bf
2 changed files with 64 additions and 22 deletions

View File

@ -11,6 +11,7 @@ import (
const ( const (
dbNodes = "nodes" dbNodes = "nodes"
dbServices = "services" dbServices = "services"
dbChecks = "checks"
dbMaxMapSize = 1024 * 1024 * 1024 // 1GB maximum size dbMaxMapSize = 1024 * 1024 * 1024 // 1GB maximum size
) )
@ -26,6 +27,7 @@ type StateStore struct {
env *mdb.Env env *mdb.Env
nodeTable *MDBTable nodeTable *MDBTable
serviceTable *MDBTable serviceTable *MDBTable
checkTable *MDBTable
tables MDBTables tables MDBTables
} }
@ -97,9 +99,17 @@ func (s *StateStore) initialize() error {
return err return err
} }
// Tables use a generic struct encoder
encoder := func(obj interface{}) []byte {
buf, err := structs.Encode(255, obj)
if err != nil {
panic(err)
}
return buf[1:]
}
// Setup our tables // Setup our tables
s.nodeTable = &MDBTable{ s.nodeTable = &MDBTable{
Env: s.env,
Name: dbNodes, Name: dbNodes,
Indexes: map[string]*MDBIndex{ Indexes: map[string]*MDBIndex{
"id": &MDBIndex{ "id": &MDBIndex{
@ -107,13 +117,6 @@ func (s *StateStore) initialize() error {
Fields: []string{"Node"}, Fields: []string{"Node"},
}, },
}, },
Encoder: func(obj interface{}) []byte {
buf, err := structs.Encode(255, obj)
if err != nil {
panic(err)
}
return buf[1:]
},
Decoder: func(buf []byte) interface{} { Decoder: func(buf []byte) interface{} {
out := new(structs.Node) out := new(structs.Node)
if err := structs.Decode(buf, out); err != nil { if err := structs.Decode(buf, out); err != nil {
@ -122,12 +125,8 @@ func (s *StateStore) initialize() error {
return out return out
}, },
} }
if err := s.nodeTable.Init(); err != nil {
return err
}
s.serviceTable = &MDBTable{ s.serviceTable = &MDBTable{
Env: s.env,
Name: dbServices, Name: dbServices,
Indexes: map[string]*MDBIndex{ Indexes: map[string]*MDBIndex{
"id": &MDBIndex{ "id": &MDBIndex{
@ -139,13 +138,6 @@ func (s *StateStore) initialize() error {
Fields: []string{"ServiceName", "ServiceTag"}, Fields: []string{"ServiceName", "ServiceTag"},
}, },
}, },
Encoder: func(obj interface{}) []byte {
buf, err := structs.Encode(255, obj)
if err != nil {
panic(err)
}
return buf[1:]
},
Decoder: func(buf []byte) interface{} { Decoder: func(buf []byte) interface{} {
out := new(structs.ServiceNode) out := new(structs.ServiceNode)
if err := structs.Decode(buf, out); err != nil { if err := structs.Decode(buf, out); err != nil {
@ -154,12 +146,44 @@ func (s *StateStore) initialize() error {
return out return out
}, },
} }
if err := s.serviceTable.Init(); err != nil {
return err s.checkTable = &MDBTable{
Name: dbChecks,
Indexes: map[string]*MDBIndex{
"id": &MDBIndex{
Unique: true,
Fields: []string{"Node", "CheckID"},
},
"status": &MDBIndex{
Fields: []string{"Status"},
},
"service": &MDBIndex{
AllowBlank: true,
Fields: []string{"ServiceName"},
},
"node": &MDBIndex{
AllowBlank: true,
Fields: []string{"Node", "ServiceID"},
},
},
Decoder: func(buf []byte) interface{} {
out := new(structs.HealthCheck)
if err := structs.Decode(buf, out); err != nil {
panic(err)
}
return out
},
} }
// Store the set of tables // Store the set of tables
s.tables = []*MDBTable{s.nodeTable, s.serviceTable} s.tables = []*MDBTable{s.nodeTable, s.serviceTable, s.checkTable}
for _, table := range s.tables {
table.Env = s.env
table.Encoder = encoder
if err := table.Init(); err != nil {
return err
}
}
return nil return nil
} }

View File

@ -19,6 +19,13 @@ const (
DeregisterRequestType DeregisterRequestType
) )
const (
HealthUnknown = "unknown"
HealthPassing = "passing"
HealthWarning = "warning"
HealthCritical = "critical"
)
// RegisterRequest is used for the Catalog.Register endpoint // RegisterRequest is used for the Catalog.Register endpoint
// to register a node as providing a service. If no service // to register a node as providing a service. If no service
// is provided, the node is registered. // is provided, the node is registered.
@ -89,6 +96,17 @@ type NodeServices struct {
Services map[string]*NodeService Services map[string]*NodeService
} }
// HealthCheck represents a single check on a given node
type HealthCheck struct {
Node string
CheckID string // Unique per-node ID
Name string // Check name
Status string // The current check status
Notes string // Additional notes with the status
ServiceID string // optional associated service
ServiceName string // optional service name
}
// Decode is used to decode a MsgPack encoded object // Decode is used to decode a MsgPack encoded object
func Decode(buf []byte, out interface{}) error { func Decode(buf []byte, out interface{}) error {
var handle codec.MsgpackHandle var handle codec.MsgpackHandle