diff --git a/api/nodes.go b/api/nodes.go index d4f089695..3daf2f7a5 100644 --- a/api/nodes.go +++ b/api/nodes.go @@ -113,25 +113,22 @@ type Node struct { Status string StatusDescription string StatusUpdatedAt int64 - NodeEvents []*NodeEvent + Events []*NodeEvent CreateIndex uint64 ModifyIndex uint64 } -// Subsystem denotes the subsystem where a node event took place. -type Subsystem string - const ( - Drain Subsystem = "Drain" - Driver Subsystem = "Driver" - Heartbeat Subsystem = "Heartbeat" - Cluster Subsystem = "Cluster" + NodeEventSubsystemDrain = "Drain" + NodeEventSubsystemDriver = "Driver" + NodeEventSubsystemHeartbeat = "Heartbeat" + NodeEventSubsystemCluster = "Cluster" ) // NodeEvent is a single unit representing a node’s state change type NodeEvent struct { Message string - Subsystem Subsystem + Subsystem string Details map[string]string Timestamp int64 diff --git a/api/nodes_test.go b/api/nodes_test.go index 7c9a8be97..06b960746 100644 --- a/api/nodes_test.go +++ b/api/nodes_test.go @@ -135,7 +135,7 @@ func TestNodes_Info(t *testing.T) { t.Fatalf("start time: %v, status updated: %v", startTime, result.StatusUpdatedAt) } - if len(result.NodeEvents) < 1 { + if len(result.Events) < 1 { t.Fatalf("Expected at minimum the node register event to be populated: %+v", result) } } diff --git a/command/agent/node_endpoint_test.go b/command/agent/node_endpoint_test.go index 16ba008de..a5566adc1 100644 --- a/command/agent/node_endpoint_test.go +++ b/command/agent/node_endpoint_test.go @@ -396,10 +396,10 @@ func TestHTTP_NodeQuery(t *testing.T) { if n.ID != node.ID { t.Fatalf("bad: %#v", n) } - if len(n.NodeEvents) < 1 { + if len(n.Events) < 1 { t.Fatalf("Expected node registration event to be populated: %#v", n) } - if n.NodeEvents[0].Message != "Node Registered" { + if n.Events[0].Message != "Node Registered" { t.Fatalf("Expected node registration event to be first node event: %#v", n) } }) diff --git a/command/node_status.go b/command/node_status.go index 85b25bb76..cbce47534 100644 --- a/command/node_status.go +++ b/command/node_status.go @@ -390,7 +390,7 @@ func (c *NodeStatusCommand) formatNode(client *api.Client, node *api.Node) int { func (c *NodeStatusCommand) outputNodeStatusEvents(node *api.Node) { c.Ui.Output(c.Colorize().Color("\n[bold]Node Events ")) - c.outputNodeEvent(node.NodeEvents) + c.outputNodeEvent(node.Events) } func (c *NodeStatusCommand) outputNodeEvent(events []*api.NodeEvent) { diff --git a/nomad/fsm_test.go b/nomad/fsm_test.go index 6205c7038..11e49c9d8 100644 --- a/nomad/fsm_test.go +++ b/nomad/fsm_test.go @@ -111,9 +111,9 @@ func TestFSM_UpsertNodeEvents(t *testing.T) { out, err := state.NodeByID(ws, node.ID) require.Nil(err) - require.Equal(2, len(out.NodeEvents)) + require.Equal(2, len(out.Events)) - first := out.NodeEvents[1] + first := out.Events[1] require.Equal(uint64(1), first.CreateIndex) require.Equal("Heartbeating failed", first.Message) } diff --git a/nomad/node_endpoint_test.go b/nomad/node_endpoint_test.go index 70c27d1c1..fde2f4d3e 100644 --- a/nomad/node_endpoint_test.go +++ b/nomad/node_endpoint_test.go @@ -114,7 +114,7 @@ func TestClientEndpoint_EmitEvents(t *testing.T) { ws := memdb.NewWatchSet() out, err := state.NodeByID(ws, node.ID) require.Nil(err) - require.False(len(out.NodeEvents) < 2) + require.False(len(out.Events) < 2) } func TestClientEndpoint_Register_SecretMismatch(t *testing.T) { @@ -986,16 +986,16 @@ func TestClientEndpoint_GetNode(t *testing.T) { // Update the status updated at value node.StatusUpdatedAt = resp2.Node.StatusUpdatedAt node.SecretID = "" - node.NodeEvents = resp2.Node.NodeEvents + node.Events = resp2.Node.Events if !reflect.DeepEqual(node, resp2.Node) { t.Fatalf("bad: %#v \n %#v", node, resp2.Node) } // assert that the node register event was set correctly - if len(resp2.Node.NodeEvents) != 1 { + if len(resp2.Node.Events) != 1 { t.Fatalf("Did not set node events: %#v", resp2.Node) } - if resp2.Node.NodeEvents[0].Message != "Node Registered" { + if resp2.Node.Events[0].Message != "Node Registered" { t.Fatalf("Did not set node register event correctly: %#v", resp2.Node) } diff --git a/nomad/state/state_store.go b/nomad/state/state_store.go index 8a6f4ce50..1aedcf63a 100644 --- a/nomad/state/state_store.go +++ b/nomad/state/state_store.go @@ -528,7 +528,7 @@ func (s *StateStore) UpsertNode(index uint64, node *structs.Node) error { node.Drain = exist.Drain // Retain the drain mode // retain node events that have already been set on the node - node.NodeEvents = exist.NodeEvents + node.Events = exist.Events } else { // Because this is the first time the node is being registered, we should // also create a node registration event @@ -537,7 +537,7 @@ func (s *StateStore) UpsertNode(index uint64, node *structs.Node) error { Subsystem: "Cluster", Timestamp: node.StatusUpdatedAt, } - node.NodeEvents = []*structs.NodeEvent{nodeEvent} + node.Events = []*structs.NodeEvent{nodeEvent} node.CreateIndex = index node.ModifyIndex = index } @@ -686,13 +686,13 @@ func (s *StateStore) upsertNodeEvents(index uint64, nodeID string, events []*str for _, e := range events { e.CreateIndex = index e.ModifyIndex = index - copyNode.NodeEvents = append(copyNode.NodeEvents, e) + copyNode.Events = append(copyNode.Events, e) } // Keep node events pruned to not exceed the max allowed - if l := len(copyNode.NodeEvents); l > structs.MaxRetainedNodeEvents { + if l := len(copyNode.Events); l > structs.MaxRetainedNodeEvents { delta := l - structs.MaxRetainedNodeEvents - copyNode.NodeEvents = copyNode.NodeEvents[delta:] + copyNode.Events = copyNode.Events[delta:] } // Insert the node diff --git a/nomad/state/state_store_test.go b/nomad/state/state_store_test.go index acba103c4..d176e178b 100644 --- a/nomad/state/state_store_test.go +++ b/nomad/state/state_store_test.go @@ -758,9 +758,9 @@ func TestStateStore_AddSingleNodeEvent(t *testing.T) { err := state.UpsertNode(1000, node) require.Nil(err) - require.Equal(1, len(node.NodeEvents)) - require.Equal(structs.Subsystem("Cluster"), node.NodeEvents[0].Subsystem) - require.Equal("Node Registered", node.NodeEvents[0].Message) + require.Equal(1, len(node.Events)) + require.Equal(structs.NodeEventSubsystemCluster, node.Events[0].Subsystem) + require.Equal("Node Registered", node.Events[0].Message) // Create a watchset so we can test that AddNodeEvent fires the watch ws := memdb.NewWatchSet() @@ -784,8 +784,8 @@ func TestStateStore_AddSingleNodeEvent(t *testing.T) { out, err := state.NodeByID(ws, node.ID) require.Nil(err) - require.Equal(2, len(out.NodeEvents)) - require.Equal(nodeEvent, out.NodeEvents[1]) + require.Equal(2, len(out.Events)) + require.Equal(nodeEvent, out.Events[1]) } // To prevent stale node events from accumulating, we limit the number of @@ -800,9 +800,9 @@ func TestStateStore_NodeEvents_RetentionWindow(t *testing.T) { if err != nil { t.Fatalf("err: %v", err) } - require.Equal(1, len(node.NodeEvents)) - require.Equal(structs.Subsystem("Cluster"), node.NodeEvents[0].Subsystem) - require.Equal("Node Registered", node.NodeEvents[0].Message) + require.Equal(1, len(node.Events)) + require.Equal(structs.NodeEventSubsystemCluster, node.Events[0].Subsystem) + require.Equal("Node Registered", node.Events[0].Message) var out *structs.Node for i := 1; i <= 20; i++ { @@ -832,9 +832,9 @@ func TestStateStore_NodeEvents_RetentionWindow(t *testing.T) { out, err = state.NodeByID(ws, node.ID) require.Nil(err) - require.Equal(10, len(out.NodeEvents)) - require.Equal(uint64(11), out.NodeEvents[0].CreateIndex) - require.Equal(uint64(20), out.NodeEvents[len(out.NodeEvents)-1].CreateIndex) + require.Equal(10, len(out.Events)) + require.Equal(uint64(11), out.Events[0].CreateIndex) + require.Equal(uint64(20), out.Events[len(out.Events)-1].CreateIndex) } func TestStateStore_Nodes(t *testing.T) { diff --git a/nomad/structs/structs.go b/nomad/structs/structs.go index e3fbe9cf7..5564f9403 100644 --- a/nomad/structs/structs.go +++ b/nomad/structs/structs.go @@ -1072,21 +1072,17 @@ type EmitNodeEventsResponse struct { WriteMeta } -// TODO needs to be a more specific name -// Subsystem denotes the subsystem where a node event took place. -type Subsystem string - const ( - Drain Subsystem = "Drain" - Driver Subsystem = "Driver" - Heartbeat Subsystem = "Heartbeat" - Cluster Subsystem = "Cluster" + NodeEventSubsystemDrain = "Drain" + NodeEventSubsystemDriver = "Driver" + NodeEventSubsystemHeartbeat = "Heartbeat" + NodeEventSubsystemCluster = "Cluster" ) // NodeEvent is a single unit representing a node’s state change type NodeEvent struct { Message string - Subsystem Subsystem + Subsystem string Details map[string]string Timestamp int64 CreateIndex uint64 @@ -1099,7 +1095,7 @@ func (ne *NodeEvent) String() string { details = append(details, fmt.Sprintf("%s: %s", k, v)) } - return fmt.Sprintf("Message: %s, Subsystem: %s, Details: %s, Timestamp: %d", ne.Message, string(ne.Subsystem), strings.Join(details, ","), ne.Timestamp) + return fmt.Sprintf("Message: %s, Subsystem: %s, Details: %s, Timestamp: %d", ne.Message, ne.Subsystem, strings.Join(details, ","), ne.Timestamp) } func (ne *NodeEvent) Copy() *NodeEvent { @@ -1212,9 +1208,9 @@ type Node struct { // updated StatusUpdatedAt int64 - // NodeEvents is the most recent set of events generated for the node, + // Events is the most recent set of events generated for the node, // retaining only MaxRetainedNodeEvents number at a time - NodeEvents []*NodeEvent + Events []*NodeEvent // Raft Indexes CreateIndex uint64 @@ -1237,7 +1233,7 @@ func (n *Node) Copy() *Node { nn.Reserved = nn.Reserved.Copy() nn.Links = helper.CopyMapStringString(nn.Links) nn.Meta = helper.CopyMapStringString(nn.Meta) - nn.NodeEvents = copyNodeEvents(n.NodeEvents) + nn.Events = copyNodeEvents(n.Events) return nn }