[client] Ensure status recorder is always initialized (#3588)

* Ensure status recorder is always initialized

* Add test

* Add subscribe test
This commit is contained in:
Viktor Liu 2025-03-27 22:48:11 +01:00 committed by GitHub
parent a4f04f5570
commit 101cce27f2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 72 additions and 12 deletions

View File

@ -84,6 +84,7 @@ func New(ctx context.Context, configPath, logFile string) *Server {
}, },
logFile: logFile, logFile: logFile,
persistNetworkMap: true, persistNetworkMap: true,
statusRecorder: peer.NewRecorder(""),
} }
} }
@ -136,9 +137,6 @@ func (s *Server) Start() error {
s.config = config s.config = config
if s.statusRecorder == nil {
s.statusRecorder = peer.NewRecorder(config.ManagementURL.String())
}
s.statusRecorder.UpdateManagementAddress(config.ManagementURL.String()) s.statusRecorder.UpdateManagementAddress(config.ManagementURL.String())
s.statusRecorder.UpdateRosenpass(config.RosenpassEnabled, config.RosenpassPermissive) s.statusRecorder.UpdateRosenpass(config.RosenpassEnabled, config.RosenpassPermissive)
@ -622,9 +620,6 @@ func (s *Server) Up(callerCtx context.Context, _ *proto.UpRequest) (*proto.UpRes
return nil, fmt.Errorf("config is not defined, please call login command first") return nil, fmt.Errorf("config is not defined, please call login command first")
} }
if s.statusRecorder == nil {
s.statusRecorder = peer.NewRecorder(s.config.ManagementURL.String())
}
s.statusRecorder.UpdateManagementAddress(s.config.ManagementURL.String()) s.statusRecorder.UpdateManagementAddress(s.config.ManagementURL.String())
s.statusRecorder.UpdateRosenpass(s.config.RosenpassEnabled, s.config.RosenpassPermissive) s.statusRecorder.UpdateRosenpass(s.config.RosenpassEnabled, s.config.RosenpassPermissive)
@ -692,9 +687,6 @@ func (s *Server) Status(
statusResponse := proto.StatusResponse{Status: string(status), DaemonVersion: version.NetbirdVersion()} statusResponse := proto.StatusResponse{Status: string(status), DaemonVersion: version.NetbirdVersion()}
if s.statusRecorder == nil {
s.statusRecorder = peer.NewRecorder(s.config.ManagementURL.String())
}
s.statusRecorder.UpdateManagementAddress(s.config.ManagementURL.String()) s.statusRecorder.UpdateManagementAddress(s.config.ManagementURL.String())
s.statusRecorder.UpdateRosenpass(s.config.RosenpassEnabled, s.config.RosenpassPermissive) s.statusRecorder.UpdateRosenpass(s.config.RosenpassEnabled, s.config.RosenpassPermissive)

View File

@ -3,20 +3,22 @@ package server
import ( import (
"context" "context"
"net" "net"
"net/url"
"testing" "testing"
"time" "time"
"github.com/golang/mock/gomock" "github.com/golang/mock/gomock"
"github.com/stretchr/testify/require"
"go.opentelemetry.io/otel"
"github.com/netbirdio/management-integrations/integrations" "github.com/netbirdio/management-integrations/integrations"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.opentelemetry.io/otel"
"google.golang.org/grpc" "google.golang.org/grpc"
"google.golang.org/grpc/keepalive" "google.golang.org/grpc/keepalive"
"github.com/netbirdio/netbird/client/internal" "github.com/netbirdio/netbird/client/internal"
"github.com/netbirdio/netbird/client/internal/peer" "github.com/netbirdio/netbird/client/internal/peer"
daemonProto "github.com/netbirdio/netbird/client/proto"
mgmtProto "github.com/netbirdio/netbird/management/proto" mgmtProto "github.com/netbirdio/netbird/management/proto"
"github.com/netbirdio/netbird/management/server" "github.com/netbirdio/netbird/management/server"
"github.com/netbirdio/netbird/management/server/activity" "github.com/netbirdio/netbird/management/server/activity"
@ -84,6 +86,72 @@ func TestConnectWithRetryRuns(t *testing.T) {
} }
} }
func TestServer_Up(t *testing.T) {
ctx := internal.CtxInitState(context.Background())
s := New(ctx, t.TempDir()+"/config.json", "console")
err := s.Start()
require.NoError(t, err)
u, err := url.Parse("http://non-existent-url-for-testing.invalid:12345")
require.NoError(t, err)
s.config = &internal.Config{
ManagementURL: u,
}
upCtx, cancel := context.WithTimeout(ctx, 1*time.Second)
defer cancel()
upReq := &daemonProto.UpRequest{}
_, err = s.Up(upCtx, upReq)
assert.Contains(t, err.Error(), "NeedsLogin")
}
type mockSubscribeEventsServer struct {
ctx context.Context
sentEvents []*daemonProto.SystemEvent
grpc.ServerStream
}
func (m *mockSubscribeEventsServer) Send(event *daemonProto.SystemEvent) error {
m.sentEvents = append(m.sentEvents, event)
return nil
}
func (m *mockSubscribeEventsServer) Context() context.Context {
return m.ctx
}
func TestServer_SubcribeEvents(t *testing.T) {
ctx := internal.CtxInitState(context.Background())
s := New(ctx, t.TempDir()+"/config.json", "console")
err := s.Start()
require.NoError(t, err)
u, err := url.Parse("http://non-existent-url-for-testing.invalid:12345")
require.NoError(t, err)
s.config = &internal.Config{
ManagementURL: u,
}
ctx, cancel := context.WithTimeout(ctx, 1*time.Second)
defer cancel()
upReq := &daemonProto.SubscribeRequest{}
mockServer := &mockSubscribeEventsServer{
ctx: ctx,
sentEvents: make([]*daemonProto.SystemEvent, 0),
ServerStream: nil,
}
err = s.SubscribeEvents(upReq, mockServer)
assert.NoError(t, err)
}
type mockServer struct { type mockServer struct {
mgmtProto.ManagementServiceServer mgmtProto.ManagementServiceServer
counter *int counter *int