From 104510978229979b6e930a81aa88abbd399ea3a8 Mon Sep 17 00:00:00 2001 From: Aleksey Savchuk Date: Tue, 3 Sep 2024 17:17:25 +0300 Subject: [PATCH] [#217] netmap: Return node netmap state directly Signed-off-by: Aleksey Savchuk --- netmap/node_info.go | 69 ++++++++++++++++++++++++++++++++++ netmap/node_info_test.go | 81 ++++++++++++++++++++++++++++++++-------- 2 files changed, 134 insertions(+), 16 deletions(-) diff --git a/netmap/node_info.go b/netmap/node_info.go index bd37388..4be4b70 100644 --- a/netmap/node_info.go +++ b/netmap/node_info.go @@ -460,6 +460,10 @@ func (x *NodeInfo) SortAttributes() { // SetOffline sets the state of the node to "offline". When a node updates // information about itself in the network map, this action is interpreted as // an intention to leave the network. +// +// See also IsOffline. +// +// Deprecated: use SetStatus instead. func (x *NodeInfo) SetOffline() { x.m.SetState(netmap.Offline) } @@ -470,6 +474,8 @@ func (x *NodeInfo) SetOffline() { // mean online). // // See also SetOffline. +// +// Deprecated: use Status instead. func (x NodeInfo) IsOffline() bool { return x.m.GetState() == netmap.Offline } @@ -479,6 +485,8 @@ func (x NodeInfo) IsOffline() bool { // action is interpreted as an intention to enter the network. // // See also IsOnline. +// +// Deprecated: use SetStatus instead. func (x *NodeInfo) SetOnline() { x.m.SetState(netmap.Online) } @@ -489,6 +497,8 @@ func (x *NodeInfo) SetOnline() { // mean offline). // // See also SetOnline. +// +// Deprecated: use Status instead. func (x NodeInfo) IsOnline() bool { return x.m.GetState() == netmap.Online } @@ -498,6 +508,8 @@ func (x NodeInfo) IsOnline() bool { // state declares temporal unavailability for a node. // // See also IsMaintenance. +// +// Deprecated: use SetStatus instead. func (x *NodeInfo) SetMaintenance() { x.m.SetState(netmap.Maintenance) } @@ -507,6 +519,63 @@ func (x *NodeInfo) SetMaintenance() { // Zero NodeInfo has undefined state. // // See also SetMaintenance. +// +// Deprecated: use Status instead. func (x NodeInfo) IsMaintenance() bool { return x.m.GetState() == netmap.Maintenance } + +type NodeState netmap.NodeState + +const ( + UnspecifiedState = NodeState(netmap.UnspecifiedState) + Online = NodeState(netmap.Online) + Offline = NodeState(netmap.Offline) + Maintenance = NodeState(netmap.Maintenance) +) + +// ToV2 converts NodeState to v2. +func (ns NodeState) ToV2() netmap.NodeState { + return netmap.NodeState(ns) +} + +// FromV2 reads NodeState to v2. +func (ns *NodeState) FromV2(state netmap.NodeState) { + *ns = NodeState(state) +} + +// Status returns the current state of the node in the network map. +// +// Zero NodeInfo has an undefined state, neither online nor offline. +func (x NodeInfo) Status() NodeState { + return NodeState(x.m.GetState()) +} + +// SetState updates the state of the node in the network map. +// +// The state determines the node's current status within the network: +// - "online": Indicates the node intends to enter the network. +// - "offline": Indicates the node intends to leave the network. +// - "maintenance": Indicates the node is temporarily unavailable. +// +// See also Status. +func (x *NodeInfo) SetStatus(state NodeState) { + x.m.SetState(netmap.NodeState(state)) +} + +// String implements fmt.Stringer. +// +// String is designed to be human-readable, and its format MAY differ between +// SDK versions. +func (ns NodeState) String() string { + return netmap.NodeState(ns).String() +} + +// IsOnline checks if the current state is "online". +func (ns NodeState) IsOnline() bool { return ns == Online } + +// IsOffline checks if the current state is "offline". +func (ns NodeState) IsOffline() bool { return ns == Offline } + +// IsMaintenance checks if the current state is "maintenance". +func (ns NodeState) IsMaintenance() bool { return ns == Maintenance } diff --git a/netmap/node_info_test.go b/netmap/node_info_test.go index 1d1c018..de61a21 100644 --- a/netmap/node_info_test.go +++ b/netmap/node_info_test.go @@ -3,6 +3,7 @@ package netmap import ( "testing" + "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/netmap" "github.com/stretchr/testify/require" ) @@ -23,27 +24,75 @@ func TestNodeInfo_SetAttribute(t *testing.T) { require.Equal(t, val, n.Attribute(key)) } +func TestNodeState(t *testing.T) { + m := map[NodeState]netmap.NodeState{ + UnspecifiedState: netmap.UnspecifiedState, + Online: netmap.Online, + Offline: netmap.Offline, + Maintenance: netmap.Maintenance, + } + + t.Run("from sdk to v2", func(t *testing.T) { + for stateSDK, stateV2 := range m { + require.Equal(t, stateV2, stateSDK.ToV2()) + } + }) + + t.Run("from v2 to sdk", func(t *testing.T) { + for stateSDK, stateV2 := range m { + var state NodeState + state.FromV2(stateV2) + require.Equal(t, stateSDK, state) + } + }) +} + func TestNodeInfo_Status(t *testing.T) { - var n NodeInfo + t.Run("deprecated getters/setters", func(t *testing.T) { + var n NodeInfo - require.False(t, n.IsOnline()) - require.False(t, n.IsOffline()) - require.False(t, n.IsMaintenance()) + require.False(t, n.IsOnline()) + require.False(t, n.IsOffline()) + require.False(t, n.IsMaintenance()) - n.SetOnline() - require.True(t, n.IsOnline()) - require.False(t, n.IsOffline()) - require.False(t, n.IsMaintenance()) + n.SetOnline() + require.True(t, n.IsOnline()) + require.False(t, n.IsOffline()) + require.False(t, n.IsMaintenance()) - n.SetOffline() - require.True(t, n.IsOffline()) - require.False(t, n.IsOnline()) - require.False(t, n.IsMaintenance()) + n.SetOffline() + require.True(t, n.IsOffline()) + require.False(t, n.IsOnline()) + require.False(t, n.IsMaintenance()) - n.SetMaintenance() - require.True(t, n.IsMaintenance()) - require.False(t, n.IsOnline()) - require.False(t, n.IsOffline()) + n.SetMaintenance() + require.True(t, n.IsMaintenance()) + require.False(t, n.IsOnline()) + require.False(t, n.IsOffline()) + }) + + t.Run("brand new getters/setters", func(t *testing.T) { + var n NodeInfo + + require.False(t, n.Status().IsOnline()) + require.False(t, n.Status().IsOffline()) + require.False(t, n.Status().IsMaintenance()) + + n.SetStatus(Online) + require.True(t, n.Status().IsOnline()) + require.False(t, n.Status().IsOffline()) + require.False(t, n.Status().IsMaintenance()) + + n.SetStatus(Offline) + require.False(t, n.Status().IsOnline()) + require.True(t, n.Status().IsOffline()) + require.False(t, n.Status().IsMaintenance()) + + n.SetStatus(Maintenance) + require.False(t, n.Status().IsOnline()) + require.False(t, n.Status().IsOffline()) + require.True(t, n.Status().IsMaintenance()) + }) } func TestNodeInfo_ExternalAddr(t *testing.T) {