6a6427526b
The UpdateAddress method use to be used when storage node's checked in with the Satellite, but once the contact service was created this method was no longer used. This PR finally removes it. Change-Id: Ib3f83c8003269671d97d54f21ee69665fa663f24
206 lines
6.3 KiB
Go
206 lines
6.3 KiB
Go
// Copyright (C) 2019 Storj Labs, Inc.
|
|
// See LICENSE for copying information.
|
|
|
|
package gracefulexit_test
|
|
|
|
import (
|
|
"fmt"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"storj.io/common/pb"
|
|
"storj.io/common/storj"
|
|
"storj.io/common/testcontext"
|
|
"storj.io/common/testrand"
|
|
"storj.io/storj/satellite"
|
|
"storj.io/storj/satellite/overlay"
|
|
"storj.io/storj/satellite/satellitedb/satellitedbtest"
|
|
)
|
|
|
|
func TestGetExitingNodes(t *testing.T) {
|
|
satellitedbtest.Run(t, func(ctx *testcontext.Context, t *testing.T, db satellite.DB) {
|
|
cache := db.OverlayCache()
|
|
exiting := make(map[storj.NodeID]bool)
|
|
exitingCount := 0
|
|
exitingLoopIncomplete := make(map[storj.NodeID]bool)
|
|
exitingLoopIncompleteCount := 0
|
|
|
|
testData := []struct {
|
|
nodeID storj.NodeID
|
|
initiatedAt time.Time
|
|
completedAt time.Time
|
|
finishedAt time.Time
|
|
isExiting bool
|
|
isExitingLoopIncomplete bool
|
|
}{
|
|
{testrand.NodeID(), time.Time{}, time.Time{}, time.Time{}, false, false},
|
|
{testrand.NodeID(), time.Now(), time.Time{}, time.Time{}, true, true},
|
|
{testrand.NodeID(), time.Now(), time.Now(), time.Time{}, true, false},
|
|
{testrand.NodeID(), time.Now(), time.Now(), time.Now(), false, false},
|
|
{testrand.NodeID(), time.Now(), time.Time{}, time.Now(), false, false},
|
|
}
|
|
|
|
for i, data := range testData {
|
|
addr := fmt.Sprintf("127.0.%d.0:8080", i)
|
|
lastNet := fmt.Sprintf("127.0.%d", i)
|
|
d := overlay.NodeCheckInInfo{NodeID: data.nodeID,
|
|
Address: &pb.NodeAddress{Address: addr},
|
|
LastIPPort: addr,
|
|
LastNet: lastNet,
|
|
Version: &pb.NodeVersion{Version: "v1.0.0"},
|
|
}
|
|
err := cache.UpdateCheckIn(ctx, d, time.Now().UTC(), overlay.NodeSelectionConfig{})
|
|
require.NoError(t, err)
|
|
|
|
req := &overlay.ExitStatusRequest{
|
|
NodeID: data.nodeID,
|
|
ExitInitiatedAt: data.initiatedAt,
|
|
ExitLoopCompletedAt: data.completedAt,
|
|
ExitFinishedAt: data.finishedAt,
|
|
}
|
|
_, err = cache.UpdateExitStatus(ctx, req)
|
|
require.NoError(t, err)
|
|
|
|
if data.isExiting {
|
|
exitingCount++
|
|
exiting[data.nodeID] = true
|
|
}
|
|
if data.isExitingLoopIncomplete {
|
|
exitingLoopIncompleteCount++
|
|
exitingLoopIncomplete[data.nodeID] = true
|
|
}
|
|
}
|
|
|
|
nodes, err := cache.GetExitingNodes(ctx)
|
|
require.NoError(t, err)
|
|
require.Len(t, nodes, exitingCount)
|
|
for _, node := range nodes {
|
|
require.True(t, exiting[node.NodeID])
|
|
}
|
|
|
|
nodes, err = cache.GetExitingNodes(ctx)
|
|
require.NoError(t, err)
|
|
exitingNodesLoopIncomplete := make(storj.NodeIDList, 0, len(nodes))
|
|
for _, node := range nodes {
|
|
if node.ExitLoopCompletedAt == nil {
|
|
exitingNodesLoopIncomplete = append(exitingNodesLoopIncomplete, node.NodeID)
|
|
}
|
|
}
|
|
require.Len(t, exitingNodesLoopIncomplete, exitingLoopIncompleteCount)
|
|
for _, id := range exitingNodesLoopIncomplete {
|
|
require.True(t, exitingLoopIncomplete[id])
|
|
}
|
|
})
|
|
}
|
|
|
|
func TestGetGracefulExitNodesByTimeframe(t *testing.T) {
|
|
satellitedbtest.Run(t, func(ctx *testcontext.Context, t *testing.T, db satellite.DB) {
|
|
cache := db.OverlayCache()
|
|
exitingToday := make(map[storj.NodeID]bool)
|
|
exitingLastWeek := make(map[storj.NodeID]bool)
|
|
exitedToday := make(map[storj.NodeID]bool)
|
|
exitedLastWeek := make(map[storj.NodeID]bool)
|
|
|
|
now := time.Now()
|
|
lastWeek := time.Now().AddDate(0, 0, -7)
|
|
|
|
testData := []struct {
|
|
nodeID storj.NodeID
|
|
initiatedAt time.Time
|
|
completedAt time.Time
|
|
finishedAt time.Time
|
|
}{
|
|
// exited today
|
|
{testrand.NodeID(), now, now, now},
|
|
// exited last week
|
|
{testrand.NodeID(), lastWeek, lastWeek, lastWeek},
|
|
// exiting today
|
|
{testrand.NodeID(), now, now, time.Time{}},
|
|
// exiting last week
|
|
{testrand.NodeID(), lastWeek, lastWeek, time.Time{}},
|
|
// not exiting
|
|
{testrand.NodeID(), time.Time{}, time.Time{}, time.Time{}},
|
|
}
|
|
|
|
for i, data := range testData {
|
|
addr := fmt.Sprintf("127.0.%d.0:8080", i)
|
|
lastNet := fmt.Sprintf("127.0.%d", i)
|
|
d := overlay.NodeCheckInInfo{NodeID: data.nodeID,
|
|
Address: &pb.NodeAddress{Address: addr},
|
|
LastIPPort: addr,
|
|
LastNet: lastNet,
|
|
Version: &pb.NodeVersion{Version: "v1.0.0"},
|
|
}
|
|
err := cache.UpdateCheckIn(ctx, d, time.Now().UTC(), overlay.NodeSelectionConfig{})
|
|
require.NoError(t, err)
|
|
|
|
req := &overlay.ExitStatusRequest{
|
|
NodeID: data.nodeID,
|
|
ExitInitiatedAt: data.initiatedAt,
|
|
ExitLoopCompletedAt: data.completedAt,
|
|
ExitFinishedAt: data.finishedAt,
|
|
}
|
|
_, err = cache.UpdateExitStatus(ctx, req)
|
|
require.NoError(t, err)
|
|
|
|
if !data.finishedAt.IsZero() {
|
|
if data.finishedAt == now {
|
|
exitedToday[data.nodeID] = true
|
|
} else {
|
|
exitedLastWeek[data.nodeID] = true
|
|
}
|
|
} else if !data.initiatedAt.IsZero() {
|
|
if data.initiatedAt == now {
|
|
exitingToday[data.nodeID] = true
|
|
} else {
|
|
exitingLastWeek[data.nodeID] = true
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
// test GetGracefulExitIncompleteByTimeFrame
|
|
ids, err := cache.GetGracefulExitIncompleteByTimeFrame(ctx, lastWeek.Add(-24*time.Hour), lastWeek.Add(24*time.Hour))
|
|
require.NoError(t, err)
|
|
require.Len(t, ids, 1)
|
|
for _, id := range ids {
|
|
require.True(t, exitingLastWeek[id])
|
|
}
|
|
ids, err = cache.GetGracefulExitIncompleteByTimeFrame(ctx, now.Add(-24*time.Hour), now.Add(24*time.Hour))
|
|
require.NoError(t, err)
|
|
require.Len(t, ids, 1)
|
|
for _, id := range ids {
|
|
require.True(t, exitingToday[id])
|
|
}
|
|
ids, err = cache.GetGracefulExitIncompleteByTimeFrame(ctx, lastWeek.Add(-24*time.Hour), now.Add(24*time.Hour))
|
|
require.NoError(t, err)
|
|
require.Len(t, ids, 2)
|
|
for _, id := range ids {
|
|
require.True(t, exitingLastWeek[id] || exitingToday[id])
|
|
}
|
|
|
|
// test GetGracefulExitCompletedByTimeFrame
|
|
ids, err = cache.GetGracefulExitCompletedByTimeFrame(ctx, lastWeek.Add(-24*time.Hour), lastWeek.Add(24*time.Hour))
|
|
require.NoError(t, err)
|
|
require.Len(t, ids, 1)
|
|
for _, id := range ids {
|
|
require.True(t, exitedLastWeek[id])
|
|
}
|
|
ids, err = cache.GetGracefulExitCompletedByTimeFrame(ctx, now.Add(-24*time.Hour), now.Add(24*time.Hour))
|
|
require.NoError(t, err)
|
|
require.Len(t, ids, 1)
|
|
for _, id := range ids {
|
|
require.True(t, exitedToday[id])
|
|
}
|
|
ids, err = cache.GetGracefulExitCompletedByTimeFrame(ctx, lastWeek.Add(-24*time.Hour), now.Add(24*time.Hour))
|
|
require.NoError(t, err)
|
|
require.Len(t, ids, 2)
|
|
for _, id := range ids {
|
|
require.True(t, exitedLastWeek[id] || exitedToday[id])
|
|
}
|
|
|
|
})
|
|
}
|