mirror of
https://github.com/netbirdio/netbird.git
synced 2026-09-08 07:51:28 +02:00
redid versioning
Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>
This commit is contained in:
@@ -24,6 +24,7 @@ import (
|
||||
"github.com/netbirdio/netbird/client/system"
|
||||
"github.com/netbirdio/netbird/encryption"
|
||||
"github.com/netbirdio/netbird/shared/management/domain"
|
||||
nbmgmtgrpc "github.com/netbirdio/netbird/shared/management/grpc"
|
||||
"github.com/netbirdio/netbird/shared/management/proto"
|
||||
"github.com/netbirdio/netbird/util/wsproxy"
|
||||
)
|
||||
@@ -1026,6 +1027,8 @@ func infoToMetaData(info *system.Info) *proto.PeerSystemMeta {
|
||||
},
|
||||
|
||||
Capabilities: peerCapabilities(*info),
|
||||
|
||||
SyncMessageVersion: syncMessageVersion(*info),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1034,14 +1037,15 @@ func peerCapabilities(info system.Info) []proto.PeerCapability {
|
||||
caps := []proto.PeerCapability{
|
||||
proto.PeerCapability_PeerCapabilitySourcePrefixes,
|
||||
}
|
||||
// PeerCapabilityComponentNetworkMap signals that this client can
|
||||
// decode the components-format SyncResponse.NetworkMapEnvelope and
|
||||
// run Calculate() locally.
|
||||
if !info.DisableComponentNetworkMap {
|
||||
caps = append(caps, proto.PeerCapability_PeerCapabilityComponentNetworkMap)
|
||||
}
|
||||
if !info.DisableIPv6 {
|
||||
caps = append(caps, proto.PeerCapability_PeerCapabilityIPv6Overlay)
|
||||
}
|
||||
return caps
|
||||
}
|
||||
|
||||
func syncMessageVersion(info system.Info) int32 {
|
||||
if info.SyncMessageVersion != nil {
|
||||
return int32(*info.SyncMessageVersion)
|
||||
}
|
||||
return int32(nbmgmtgrpc.CurrentSyncMessageVersion)
|
||||
}
|
||||
|
||||
66
shared/management/grpc/sync_message_versions.go
Normal file
66
shared/management/grpc/sync_message_versions.go
Normal file
@@ -0,0 +1,66 @@
|
||||
package grpc
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type SyncMessageVersion uint16
|
||||
|
||||
const (
|
||||
Base SyncMessageVersion = iota
|
||||
ComponentNetworkMap
|
||||
)
|
||||
|
||||
const CurrentSyncMessageVersion = ComponentNetworkMap
|
||||
|
||||
var ErrorUnrecognizedSyncMessageVersion = errors.New("unrecognized SyncMessageVersion")
|
||||
|
||||
func ValidateSyncMessageVersion(v *int) error {
|
||||
// empty list == we support all available versions
|
||||
if v == nil {
|
||||
return nil
|
||||
}
|
||||
if *v < 0 || *v > int(CurrentSyncMessageVersion) {
|
||||
return fmt.Errorf("sync message version must between 0 and %d, %w", CurrentSyncMessageVersion, ErrorUnrecognizedSyncMessageVersion)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// returns SyncMessage version from config, or highest available version if the config is missing or
|
||||
// base if it is invalid
|
||||
// the assumption is ValidateSyncMessageVersion() has been called before using SyncMessageVersionFromConfig()
|
||||
func SyncMessageVersionFromConfig(v *int) SyncMessageVersion {
|
||||
if v == nil {
|
||||
return CurrentSyncMessageVersion
|
||||
}
|
||||
if *v < 0 || *v > int(CurrentSyncMessageVersion) {
|
||||
return Base
|
||||
}
|
||||
|
||||
return SyncMessageVersion(*v)
|
||||
}
|
||||
|
||||
// convert per-account supprted versions to SyncMessageVersion
|
||||
// the assumption is ValidateSyncMessageVersion() has been called before using SyncMessageVersionsFromMap()
|
||||
func SyncMessageVersionsFromMap(toconvert map[string]int) map[string]SyncMessageVersion {
|
||||
// no per-account overrides
|
||||
if len(toconvert) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
toret := make(map[string]SyncMessageVersion)
|
||||
|
||||
for account, version := range toconvert {
|
||||
toret[account] = SyncMessageVersionFromConfig(&version)
|
||||
}
|
||||
return toret
|
||||
}
|
||||
|
||||
// return highest common sync message version, or Default (which is always available)
|
||||
func HighestCommonSyncMessageVersions(a SyncMessageVersion, b SyncMessageVersion) SyncMessageVersion {
|
||||
if a > b {
|
||||
return b
|
||||
}
|
||||
return a
|
||||
}
|
||||
36
shared/management/grpc/sync_message_versions_test.go
Normal file
36
shared/management/grpc/sync_message_versions_test.go
Normal file
@@ -0,0 +1,36 @@
|
||||
package grpc
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestValidation(t *testing.T) {
|
||||
assert.NoError(t, ValidateSyncMessageVersion(nil))
|
||||
assert.NoError(t, ValidateSyncMessageVersion(toIntPtr(0)))
|
||||
assert.ErrorIs(t, ValidateSyncMessageVersion(toIntPtr(int(^uint(0)>>1))), ErrorUnrecognizedSyncMessageVersion)
|
||||
assert.ErrorIs(t, ValidateSyncMessageVersion(toIntPtr(-1)), ErrorUnrecognizedSyncMessageVersion)
|
||||
}
|
||||
|
||||
func TestVersionFromConfig(t *testing.T) {
|
||||
assert.Equal(t, CurrentSyncMessageVersion, SyncMessageVersionFromConfig(nil))
|
||||
assert.Equal(t, CurrentSyncMessageVersion, SyncMessageVersionFromConfig(toIntPtr(1)))
|
||||
assert.Equal(t, Base, SyncMessageVersionFromConfig(toIntPtr(-1)))
|
||||
assert.Equal(t, Base, SyncMessageVersionFromConfig(toIntPtr(int(^uint(0)>>1))))
|
||||
}
|
||||
|
||||
func TestPerAccountConversionStringToEnum(t *testing.T) {
|
||||
assert.Equal(t, map[string]SyncMessageVersion{"1": CurrentSyncMessageVersion}, SyncMessageVersionsFromMap(map[string]int{"1": 1}))
|
||||
assert.Equal(t, map[string]SyncMessageVersion{"2": Base}, SyncMessageVersionsFromMap(map[string]int{"2": -1}))
|
||||
}
|
||||
|
||||
func TestCommonVersions(t *testing.T) {
|
||||
assert.Equal(t, Base, HighestCommonSyncMessageVersions(Base, CurrentSyncMessageVersion))
|
||||
assert.Equal(t, Base, HighestCommonSyncMessageVersions(CurrentSyncMessageVersion, Base))
|
||||
assert.Equal(t, CurrentSyncMessageVersion, HighestCommonSyncMessageVersions(CurrentSyncMessageVersion, CurrentSyncMessageVersion))
|
||||
}
|
||||
|
||||
func toIntPtr(v int) *int {
|
||||
return &v
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -121,11 +121,6 @@ message SyncRequest {
|
||||
PeerSystemMeta meta = 1;
|
||||
}
|
||||
|
||||
enum SyncResponseVersion {
|
||||
VersionUnknown = 0;
|
||||
VersionComponentNetworkMap = 1;
|
||||
}
|
||||
|
||||
// SyncResponse represents a state that should be applied to the local peer (e.g. Netbird servers config as well as local peer and remote peers configs)
|
||||
message SyncResponse {
|
||||
|
||||
@@ -162,7 +157,7 @@ message SyncResponse {
|
||||
// locally instead of receiving an expanded NetworkMap.
|
||||
NetworkMapEnvelope NetworkMapEnvelope = 8;
|
||||
|
||||
SyncResponseVersion Version = 9;
|
||||
int32 Version = 9;
|
||||
}
|
||||
|
||||
message SyncMetaRequest {
|
||||
@@ -267,6 +262,7 @@ message PeerSystemMeta {
|
||||
Flags flags = 17;
|
||||
|
||||
repeated PeerCapability capabilities = 18;
|
||||
int32 syncMessageVersion = 19;
|
||||
}
|
||||
|
||||
message LoginResponse {
|
||||
|
||||
Reference in New Issue
Block a user