consul/state: working on node deletion

This commit is contained in:
Ryan Uber 2015-08-24 18:26:38 -07:00 committed by James Phillips
parent 766c367ef4
commit 5a8d8b0362
2 changed files with 59 additions and 0 deletions

View File

@ -119,6 +119,40 @@ func (s *StateStore) Nodes() (structs.Nodes, error) {
return results, nil return results, nil
} }
// DeleteNode is used to delete a given node by its ID.
func (s *StateStore) DeleteNode(idx uint64, nodeID string) error {
tx := s.db.Txn(true)
defer tx.Abort()
// Call the node deletion.
if err := s.deleteNodeTxn(idx, nodeID, tx); err != nil {
return err
}
tx.Commit()
return nil
}
func (s *StateStore) deleteNodeTxn(idx uint64, nodeID string, tx *memdb.Txn) error {
// Look up the node
node, err := tx.First("nodes", "id", nodeID)
if err != nil {
return fmt.Errorf("node lookup failed: %s", err)
}
// Delete the node and update the index
if err := tx.Delete("nodes", node); err != nil {
return fmt.Errorf("failed deleting node: %s", err)
}
if err := tx.Insert("index", &IndexEntry{"nodes", idx}); err != nil {
return fmt.Errorf("failed updating index: %s", err)
}
// TODO: session invalidation
// TODO: watch trigger
return nil
}
// EnsureService is called to upsert creation of a given NodeService. // EnsureService is called to upsert creation of a given NodeService.
func (s *StateStore) EnsureService(idx uint64, node string, svc *structs.NodeService) error { func (s *StateStore) EnsureService(idx uint64, node string, svc *structs.NodeService) error {
tx := s.db.Txn(true) tx := s.db.Txn(true)

View File

@ -124,6 +124,31 @@ func TestStateStore_GetNodes(t *testing.T) {
} }
} }
func TestStateStore_DeleteNode(t *testing.T) {
s := testStateStore(t)
// Create a node
node := &structs.Node{Node: "node1", Address: "1.1.1.1"}
if err := s.EnsureNode(1, node); err != nil {
t.Fatalf("err: %s", err)
}
// The node exists
if n, err := s.GetNode("node1"); err != nil || n == nil {
t.Fatalf("bad: %#v (%#v)", n, err)
}
// Delete the node
if err := s.DeleteNode(2, "node1"); err != nil {
t.Fatalf("err: %s", err)
}
// The node is now gone
if n, err := s.GetNode("node1"); err != nil || n != nil {
t.Fatalf("bad: %#v (%#v)", node, err)
}
}
func TestStateStore_EnsureService_NodeServices(t *testing.T) { func TestStateStore_EnsureService_NodeServices(t *testing.T) {
s := testStateStore(t) s := testStateStore(t)