Define constants for version semantics

This commit is contained in:
M Essam Hamed
2025-08-26 15:41:32 +03:00
parent 84501a3f56
commit 58d48127e0
5 changed files with 46 additions and 28 deletions

View File

@@ -76,6 +76,9 @@ const (
PeerConnectionTimeoutMax = 45000 // ms
PeerConnectionTimeoutMin = 30000 // ms
connInitLimit = 200
// skipAutoUpdateVersion used as a placeholder for autoUpdateVersion in proto responses to indicate response contains no new updates
skipAutoUpdateVersion = "skip"
disableAutoUpdate = "disabled"
)
var ErrResetConnection = fmt.Errorf("reset connection")
@@ -704,15 +707,17 @@ func (e *Engine) handleSync(update *mgmProto.SyncResponse) error {
e.syncMsgMux.Lock()
defer e.syncMsgMux.Unlock()
if e.updateManager == nil && update.GetAutoUpdateVersion() != "disabled" {
e.updateManager = updatemanager.NewUpdateManager(e.statusRecorder)
e.updateManager.Start(e.ctx)
} else if e.updateManager != nil && update.GetAutoUpdateVersion() == "disabled" {
e.updateManager.Stop()
e.updateManager = nil
}
if e.updateManager != nil {
e.updateManager.SetVersion(update.GetAutoUpdateVersion())
if update.GetAutoUpdateVersion() != skipAutoUpdateVersion {
if e.updateManager == nil && update.GetAutoUpdateVersion() != disableAutoUpdate {
e.updateManager = updatemanager.NewUpdateManager(e.statusRecorder)
e.updateManager.Start(e.ctx)
} else if e.updateManager != nil && update.GetAutoUpdateVersion() == disableAutoUpdate {
e.updateManager.Stop()
e.updateManager = nil
}
if e.updateManager != nil {
e.updateManager.SetVersion(update.GetAutoUpdateVersion())
}
}
if update.GetNetbirdConfig() != nil {
wCfg := update.GetNetbirdConfig()

View File

@@ -34,8 +34,9 @@ type UpdateManager struct {
cancel context.CancelFunc
update *version.Update
expectedVersion string
expectedVersionMutex sync.Mutex
expectedVersion *v.Version
updateToLatestVersion bool
expectedVersionMutex sync.Mutex
}
func NewUpdateManager(statusRecorder *peer.Status) *UpdateManager {
@@ -69,7 +70,7 @@ func (u *UpdateManager) Start(ctx context.Context) {
go u.updateLoop(ctx)
}
func (u *UpdateManager) SetVersion(v string) {
func (u *UpdateManager) SetVersion(expectedVersion string) {
if u.cancel == nil {
log.Errorf("UpdateManager not started")
return
@@ -77,12 +78,22 @@ func (u *UpdateManager) SetVersion(v string) {
u.expectedVersionMutex.Lock()
defer u.expectedVersionMutex.Unlock()
if u.expectedVersion == v {
return
if expectedVersion == latestVersion {
u.updateToLatestVersion = true
u.expectedVersion = nil
} else {
expectedSemVer, err := v.NewVersion(expectedVersion)
if err != nil {
log.Errorf("Error parsing version: %v", err)
return
}
if u.expectedVersion.Equal(expectedSemVer) {
return
}
u.expectedVersion = expectedSemVer
u.updateToLatestVersion = false
}
u.expectedVersion = v
select {
case u.mgmUpdateChan <- struct{}{}:
default:
@@ -126,19 +137,17 @@ func (u *UpdateManager) handleUpdate(ctx context.Context) {
u.expectedVersionMutex.Unlock()
// Resolve "latest" to actual version
if expectedVersion == latestVersion {
if u.updateToLatestVersion {
if !u.isVersionAvailable() {
log.Tracef("Latest version not fetched yet")
return
}
updateVersion = u.update.LatestVersion()
} else if u.expectedVersion != nil {
updateVersion = expectedVersion
} else {
var err error
updateVersion, err = v.NewSemver(expectedVersion)
if err != nil {
log.Errorf("Failed to parse latest version: %v", err)
return
}
log.Debugf("No expected version information set")
return
}
if !u.shouldUpdate(updateVersion) {

View File

@@ -52,6 +52,8 @@ const (
peerSchedulerRetryInterval = 3 * time.Second
emptyUserID = "empty user ID in claims"
errorGettingDomainAccIDFmt = "error getting account ID by private domain: %v"
// skipAutoUpdateVersion used as a placeholder for autoUpdateVersion in proto responses to indicate response contains no new updates
skipAutoUpdateVersion = "skip"
)
type userLoggedInOnce bool

View File

@@ -28,7 +28,9 @@ const (
// MinNetworkBits is the minimum prefix length for IPv4 network ranges (e.g., /29 gives 8 addresses, /28 gives 16)
MinNetworkBitsIPv4 = 28
// MinNetworkBitsIPv6 is the minimum prefix length for IPv6 network ranges
MinNetworkBitsIPv6 = 120
MinNetworkBitsIPv6 = 120
disableAutoUpdate = "disabled"
autoUpdateLatestVersion = "latest"
)
// handler is a handler that handles the server.Account HTTP endpoints
@@ -206,8 +208,8 @@ func (h *handler) updateAccountRequestSettings(req api.PutApiAccountsAccountIdJS
}
if req.Settings.AutoUpdateVersion != nil {
_, err := goversion.NewSemver(*req.Settings.AutoUpdateVersion)
if *req.Settings.AutoUpdateVersion == "latest" ||
*req.Settings.AutoUpdateVersion == "disabled" ||
if *req.Settings.AutoUpdateVersion == autoUpdateLatestVersion ||
*req.Settings.AutoUpdateVersion == disableAutoUpdate ||
err == nil {
returnSettings.AutoUpdateVersion = *req.Settings.AutoUpdateVersion
} else if *req.Settings.AutoUpdateVersion != "" {

View File

@@ -210,7 +210,7 @@ func (m *TimeBasedAuthSecretsManager) pushNewTURNAndRelayTokens(ctx context.Cont
NetbirdConfig: &proto.NetbirdConfig{
Turns: turns,
},
AutoUpdateVersion: "skip",
AutoUpdateVersion: skipAutoUpdateVersion,
}
// workaround for the case when client is unable to handle turn and relay updates at different time
@@ -247,7 +247,7 @@ func (m *TimeBasedAuthSecretsManager) pushNewRelayTokens(ctx context.Context, ac
},
// omit Turns to avoid updates there
},
AutoUpdateVersion: "skip",
AutoUpdateVersion: skipAutoUpdateVersion,
}
m.extendNetbirdConfig(ctx, peerID, accountID, update)