mirror of
https://github.com/netbirdio/netbird.git
synced 2026-10-12 00:19:08 +02:00
Refactor stateManager parameter to use value type instead of pointer in multiple functions
This commit is contained in:
@@ -15,7 +15,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// NewFirewall creates a firewall manager instance
|
// NewFirewall creates a firewall manager instance
|
||||||
func NewFirewall(iface IFaceMapper, _ *statemanager.Manager, flowLogger nftypes.FlowLogger, disableServerRoutes bool) (firewall.Manager, error) {
|
func NewFirewall(iface IFaceMapper, _ statemanager.Manager, flowLogger nftypes.FlowLogger, disableServerRoutes bool) (firewall.Manager, error) {
|
||||||
if !iface.IsUserspaceBind() {
|
if !iface.IsUserspaceBind() {
|
||||||
return nil, fmt.Errorf("not implemented for this OS: %s", runtime.GOOS)
|
return nil, fmt.Errorf("not implemented for this OS: %s", runtime.GOOS)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ const SKIP_NFTABLES_ENV = "NB_SKIP_NFTABLES_CHECK"
|
|||||||
// FWType is the type for the firewall type
|
// FWType is the type for the firewall type
|
||||||
type FWType int
|
type FWType int
|
||||||
|
|
||||||
func NewFirewall(iface IFaceMapper, stateManager *statemanager.Manager, flowLogger nftypes.FlowLogger, disableServerRoutes bool) (firewall.Manager, error) {
|
func NewFirewall(iface IFaceMapper, stateManager statemanager.Manager, flowLogger nftypes.FlowLogger, disableServerRoutes bool) (firewall.Manager, error) {
|
||||||
// on the linux system we try to user nftables or iptables
|
// on the linux system we try to user nftables or iptables
|
||||||
// in any case, because we need to allow netbird interface traffic
|
// in any case, because we need to allow netbird interface traffic
|
||||||
// so we use AllowNetbird traffic from these firewall managers
|
// so we use AllowNetbird traffic from these firewall managers
|
||||||
@@ -51,7 +51,7 @@ func NewFirewall(iface IFaceMapper, stateManager *statemanager.Manager, flowLogg
|
|||||||
return createUserspaceFirewall(iface, fm, disableServerRoutes, flowLogger)
|
return createUserspaceFirewall(iface, fm, disableServerRoutes, flowLogger)
|
||||||
}
|
}
|
||||||
|
|
||||||
func createNativeFirewall(iface IFaceMapper, stateManager *statemanager.Manager, routes bool) (firewall.Manager, error) {
|
func createNativeFirewall(iface IFaceMapper, stateManager statemanager.Manager, routes bool) (firewall.Manager, error) {
|
||||||
fm, err := createFW(iface)
|
fm, err := createFW(iface)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("create firewall: %s", err)
|
return nil, fmt.Errorf("create firewall: %s", err)
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ type aclManager struct {
|
|||||||
optionalEntries map[string][]entry
|
optionalEntries map[string][]entry
|
||||||
ipsetStore *ipsetStore
|
ipsetStore *ipsetStore
|
||||||
|
|
||||||
stateManager *statemanager.Manager
|
stateManager statemanager.Manager
|
||||||
}
|
}
|
||||||
|
|
||||||
func newAclManager(iptablesClient *iptables.IPTables, wgIface iFaceMapper) (*aclManager, error) {
|
func newAclManager(iptablesClient *iptables.IPTables, wgIface iFaceMapper) (*aclManager, error) {
|
||||||
@@ -55,7 +55,7 @@ func newAclManager(iptablesClient *iptables.IPTables, wgIface iFaceMapper) (*acl
|
|||||||
return m, nil
|
return m, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *aclManager) init(stateManager *statemanager.Manager) error {
|
func (m *aclManager) init(stateManager statemanager.Manager) error {
|
||||||
m.stateManager = stateManager
|
m.stateManager = stateManager
|
||||||
|
|
||||||
m.seedInitialEntries()
|
m.seedInitialEntries()
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ func Create(wgIface iFaceMapper) (*Manager, error) {
|
|||||||
return m, nil
|
return m, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Manager) Init(stateManager *statemanager.Manager) error {
|
func (m *Manager) Init(stateManager statemanager.Manager) error {
|
||||||
state := &ShutdownState{
|
state := &ShutdownState{
|
||||||
InterfaceState: &InterfaceState{
|
InterfaceState: &InterfaceState{
|
||||||
NameStr: m.wgIface.Name(),
|
NameStr: m.wgIface.Name(),
|
||||||
@@ -167,7 +167,7 @@ func (m *Manager) SetLegacyManagement(isLegacy bool) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Reset firewall to the default state
|
// Reset firewall to the default state
|
||||||
func (m *Manager) Close(stateManager *statemanager.Manager) error {
|
func (m *Manager) Close(stateManager statemanager.Manager) error {
|
||||||
m.mutex.Lock()
|
m.mutex.Lock()
|
||||||
defer m.mutex.Unlock()
|
defer m.mutex.Unlock()
|
||||||
|
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ type router struct {
|
|||||||
wgIface iFaceMapper
|
wgIface iFaceMapper
|
||||||
legacyManagement bool
|
legacyManagement bool
|
||||||
|
|
||||||
stateManager *statemanager.Manager
|
stateManager statemanager.Manager
|
||||||
ipFwdState *ipfwdstate.IPForwardingState
|
ipFwdState *ipfwdstate.IPForwardingState
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -104,7 +104,7 @@ func newRouter(iptablesClient *iptables.IPTables, wgIface iFaceMapper) (*router,
|
|||||||
return r, nil
|
return r, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *router) init(stateManager *statemanager.Manager) error {
|
func (r *router) init(stateManager statemanager.Manager) error {
|
||||||
r.stateManager = stateManager
|
r.stateManager = stateManager
|
||||||
|
|
||||||
if err := r.cleanUpDefaultForwardRules(); err != nil {
|
if err := r.cleanUpDefaultForwardRules(); err != nil {
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ const (
|
|||||||
// It declares methods which handle actions required by the
|
// It declares methods which handle actions required by the
|
||||||
// Netbird client for ACL and routing functionality
|
// Netbird client for ACL and routing functionality
|
||||||
type Manager interface {
|
type Manager interface {
|
||||||
Init(stateManager *statemanager.Manager) error
|
Init(stateManager statemanager.Manager) error
|
||||||
|
|
||||||
// AllowNetbird allows netbird interface traffic
|
// AllowNetbird allows netbird interface traffic
|
||||||
AllowNetbird() error
|
AllowNetbird() error
|
||||||
@@ -103,7 +103,7 @@ type Manager interface {
|
|||||||
SetLegacyManagement(legacy bool) error
|
SetLegacyManagement(legacy bool) error
|
||||||
|
|
||||||
// Close closes the firewall manager
|
// Close closes the firewall manager
|
||||||
Close(stateManager *statemanager.Manager) error
|
Close(stateManager statemanager.Manager) error
|
||||||
|
|
||||||
// Flush the changes to firewall controller
|
// Flush the changes to firewall controller
|
||||||
Flush() error
|
Flush() error
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ func Create(wgIface iFaceMapper) (*Manager, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Init nftables firewall manager
|
// Init nftables firewall manager
|
||||||
func (m *Manager) Init(stateManager *statemanager.Manager) error {
|
func (m *Manager) Init(stateManager statemanager.Manager) error {
|
||||||
workTable, err := m.createWorkTable()
|
workTable, err := m.createWorkTable()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("create work table: %w", err)
|
return fmt.Errorf("create work table: %w", err)
|
||||||
@@ -243,7 +243,7 @@ func (m *Manager) SetLegacyManagement(isLegacy bool) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Reset firewall to the default state
|
// Reset firewall to the default state
|
||||||
func (m *Manager) Close(stateManager *statemanager.Manager) error {
|
func (m *Manager) Close(stateManager statemanager.Manager) error {
|
||||||
m.mutex.Lock()
|
m.mutex.Lock()
|
||||||
defer m.mutex.Unlock()
|
defer m.mutex.Unlock()
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// Reset firewall to the default state
|
// Reset firewall to the default state
|
||||||
func (m *Manager) Close(stateManager *statemanager.Manager) error {
|
func (m *Manager) Close(stateManager statemanager.Manager) error {
|
||||||
m.mutex.Lock()
|
m.mutex.Lock()
|
||||||
defer m.mutex.Unlock()
|
defer m.mutex.Unlock()
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// Reset firewall to the default state
|
// Reset firewall to the default state
|
||||||
func (m *Manager) Close(*statemanager.Manager) error {
|
func (m *Manager) Close(statemanager.Manager) error {
|
||||||
m.mutex.Lock()
|
m.mutex.Lock()
|
||||||
defer m.mutex.Unlock()
|
defer m.mutex.Unlock()
|
||||||
|
|
||||||
|
|||||||
@@ -322,7 +322,7 @@ func (m *Manager) initForwarder() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Manager) Init(*statemanager.Manager) error {
|
func (m *Manager) Init(statemanager.Manager) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ var (
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
type repairConfFn func([]string, string, *resolvConf, *statemanager.Manager) error
|
type repairConfFn func([]string, string, *resolvConf, statemanager.Manager) error
|
||||||
|
|
||||||
type repair struct {
|
type repair struct {
|
||||||
operationFile string
|
operationFile string
|
||||||
@@ -42,7 +42,7 @@ func newRepair(operationFile string, updateFn repairConfFn) *repair {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *repair) watchFileChanges(nbSearchDomains []string, nbNameserverIP string, stateManager *statemanager.Manager) {
|
func (f *repair) watchFileChanges(nbSearchDomains []string, nbNameserverIP string, stateManager statemanager.Manager) {
|
||||||
if f.inotify != nil {
|
if f.inotify != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -105,7 +105,7 @@ nameserver 8.8.8.8`,
|
|||||||
|
|
||||||
var changed bool
|
var changed bool
|
||||||
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
|
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
|
||||||
updateFn := func([]string, string, *resolvConf, *statemanager.Manager) error {
|
updateFn := func([]string, string, *resolvConf, statemanager.Manager) error {
|
||||||
changed = true
|
changed = true
|
||||||
cancel()
|
cancel()
|
||||||
return nil
|
return nil
|
||||||
@@ -152,7 +152,7 @@ searchdomain netbird.cloud something`
|
|||||||
|
|
||||||
var changed bool
|
var changed bool
|
||||||
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
|
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
|
||||||
updateFn := func([]string, string, *resolvConf, *statemanager.Manager) error {
|
updateFn := func([]string, string, *resolvConf, statemanager.Manager) error {
|
||||||
changed = true
|
changed = true
|
||||||
cancel()
|
cancel()
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ func (f *fileConfigurator) supportCustomPort() bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *fileConfigurator) applyDNSConfig(config HostDNSConfig, stateManager *statemanager.Manager) error {
|
func (f *fileConfigurator) applyDNSConfig(config HostDNSConfig, stateManager statemanager.Manager) error {
|
||||||
backupFileExist := f.isBackupFileExist()
|
backupFileExist := f.isBackupFileExist()
|
||||||
if !config.RouteAll {
|
if !config.RouteAll {
|
||||||
if backupFileExist {
|
if backupFileExist {
|
||||||
@@ -86,7 +86,7 @@ func (f *fileConfigurator) applyDNSConfig(config HostDNSConfig, stateManager *st
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *fileConfigurator) updateConfig(nbSearchDomains []string, nbNameserverIP string, cfg *resolvConf, stateManager *statemanager.Manager) error {
|
func (f *fileConfigurator) updateConfig(nbSearchDomains []string, nbNameserverIP string, cfg *resolvConf, stateManager statemanager.Manager) error {
|
||||||
searchDomainList := mergeSearchDomains(nbSearchDomains, cfg.searchDomains)
|
searchDomainList := mergeSearchDomains(nbSearchDomains, cfg.searchDomains)
|
||||||
nameServers := generateNsList(nbNameserverIP, cfg)
|
nameServers := generateNsList(nbNameserverIP, cfg)
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type hostManager interface {
|
type hostManager interface {
|
||||||
applyDNSConfig(config HostDNSConfig, stateManager *statemanager.Manager) error
|
applyDNSConfig(config HostDNSConfig, stateManager statemanager.Manager) error
|
||||||
restoreHostDNS() error
|
restoreHostDNS() error
|
||||||
supportCustomPort() bool
|
supportCustomPort() bool
|
||||||
string() string
|
string() string
|
||||||
@@ -43,14 +43,14 @@ type DomainConfig struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type mockHostConfigurator struct {
|
type mockHostConfigurator struct {
|
||||||
applyDNSConfigFunc func(config HostDNSConfig, stateManager *statemanager.Manager) error
|
applyDNSConfigFunc func(config HostDNSConfig, stateManager statemanager.Manager) error
|
||||||
restoreHostDNSFunc func() error
|
restoreHostDNSFunc func() error
|
||||||
supportCustomPortFunc func() bool
|
supportCustomPortFunc func() bool
|
||||||
restoreUncleanShutdownDNSFunc func(*netip.Addr) error
|
restoreUncleanShutdownDNSFunc func(*netip.Addr) error
|
||||||
stringFunc func() string
|
stringFunc func() string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *mockHostConfigurator) applyDNSConfig(config HostDNSConfig, stateManager *statemanager.Manager) error {
|
func (m *mockHostConfigurator) applyDNSConfig(config HostDNSConfig, stateManager statemanager.Manager) error {
|
||||||
if m.applyDNSConfigFunc != nil {
|
if m.applyDNSConfigFunc != nil {
|
||||||
return m.applyDNSConfigFunc(config, stateManager)
|
return m.applyDNSConfigFunc(config, stateManager)
|
||||||
}
|
}
|
||||||
@@ -80,7 +80,7 @@ func (m *mockHostConfigurator) string() string {
|
|||||||
|
|
||||||
func newNoopHostMocker() hostManager {
|
func newNoopHostMocker() hostManager {
|
||||||
return &mockHostConfigurator{
|
return &mockHostConfigurator{
|
||||||
applyDNSConfigFunc: func(config HostDNSConfig, stateManager *statemanager.Manager) error { return nil },
|
applyDNSConfigFunc: func(config HostDNSConfig, stateManager statemanager.Manager) error { return nil },
|
||||||
restoreHostDNSFunc: func() error { return nil },
|
restoreHostDNSFunc: func() error { return nil },
|
||||||
supportCustomPortFunc: func() bool { return true },
|
supportCustomPortFunc: func() bool { return true },
|
||||||
restoreUncleanShutdownDNSFunc: func(*netip.Addr) error { return nil },
|
restoreUncleanShutdownDNSFunc: func(*netip.Addr) error { return nil },
|
||||||
@@ -122,7 +122,7 @@ func dnsConfigToHostDNSConfig(dnsConfig nbdns.Config, ip string, port int) HostD
|
|||||||
|
|
||||||
type noopHostConfigurator struct{}
|
type noopHostConfigurator struct{}
|
||||||
|
|
||||||
func (n noopHostConfigurator) applyDNSConfig(HostDNSConfig, *statemanager.Manager) error {
|
func (n noopHostConfigurator) applyDNSConfig(HostDNSConfig, statemanager.Manager) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ func newHostManager() (*androidHostManager, error) {
|
|||||||
return &androidHostManager{}, nil
|
return &androidHostManager{}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a androidHostManager) applyDNSConfig(HostDNSConfig, *statemanager.Manager) error {
|
func (a androidHostManager) applyDNSConfig(HostDNSConfig, statemanager.Manager) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ package dns
|
|||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"net"
|
"net"
|
||||||
@@ -49,7 +50,7 @@ func (s *systemConfigurator) supportCustomPort() bool {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *systemConfigurator) applyDNSConfig(config HostDNSConfig, stateManager *statemanager.Manager) error {
|
func (s *systemConfigurator) applyDNSConfig(config HostDNSConfig, stateManager statemanager.Manager) error {
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
if err := stateManager.UpdateState(&ShutdownState{}); err != nil {
|
if err := stateManager.UpdateState(&ShutdownState{}); err != nil {
|
||||||
@@ -200,8 +201,12 @@ func (s *systemConfigurator) recordSystemDNSSettings(force bool) error {
|
|||||||
func (s *systemConfigurator) getSystemDNSSettings() (SystemDNSSettings, error) {
|
func (s *systemConfigurator) getSystemDNSSettings() (SystemDNSSettings, error) {
|
||||||
primaryServiceKey, _, err := s.getPrimaryService()
|
primaryServiceKey, _, err := s.getPrimaryService()
|
||||||
if err != nil || primaryServiceKey == "" {
|
if err != nil || primaryServiceKey == "" {
|
||||||
|
if err == nil {
|
||||||
|
err = errors.New("primary service key not found")
|
||||||
|
}
|
||||||
return SystemDNSSettings{}, fmt.Errorf("couldn't find the primary service key: %w", err)
|
return SystemDNSSettings{}, fmt.Errorf("couldn't find the primary service key: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
dnsServiceKey := getKeyWithInput(primaryServiceStateKeyFormat, primaryServiceKey)
|
dnsServiceKey := getKeyWithInput(primaryServiceStateKeyFormat, primaryServiceKey)
|
||||||
line := buildCommandLine("show", dnsServiceKey, "")
|
line := buildCommandLine("show", dnsServiceKey, "")
|
||||||
stdinCommands := wrapCommand(line)
|
stdinCommands := wrapCommand(line)
|
||||||
@@ -379,7 +384,7 @@ func buildWriteStateOperation(operation, state, commands string) string {
|
|||||||
return fmt.Sprintf("d.init\n%s %s\n%s\nset %s\n", operation, state, commands, state)
|
return fmt.Sprintf("d.init\n%s %s\n%s\nset %s\n", operation, state, commands, state)
|
||||||
}
|
}
|
||||||
|
|
||||||
func runSystemConfigCommand(command string) ([]byte, error) {
|
var runSystemConfigCommand = func(command string) ([]byte, error) {
|
||||||
cmd := exec.Command(scutilPath)
|
cmd := exec.Command(scutilPath)
|
||||||
cmd.Stdin = strings.NewReader(command)
|
cmd.Stdin = strings.NewReader(command)
|
||||||
out, err := cmd.Output()
|
out, err := cmd.Output()
|
||||||
|
|||||||
@@ -0,0 +1,210 @@
|
|||||||
|
package dns
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"os/exec"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
"github.com/stretchr/testify/mock"
|
||||||
|
"go.uber.org/mock/gomock"
|
||||||
|
|
||||||
|
"github.com/netbirdio/netbird/client/internal/statemanager/mocks"
|
||||||
|
)
|
||||||
|
|
||||||
|
// MockCommander to mock exec.Command
|
||||||
|
type MockCommander struct {
|
||||||
|
mock.Mock
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *MockCommander) Command(name string, arg ...string) *exec.Cmd {
|
||||||
|
args := m.Called(name, arg)
|
||||||
|
return args.Get(0).(*exec.Cmd)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestNewHostManager(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
wantErr bool
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "successful creation",
|
||||||
|
wantErr: false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
got, err := newHostManager()
|
||||||
|
if tt.wantErr {
|
||||||
|
assert.Error(t, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.NotNil(t, got)
|
||||||
|
assert.NotNil(t, got.createdKeys)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestApplyDNSConfig(t *testing.T) {
|
||||||
|
type mockSetup struct {
|
||||||
|
stateManagerError error
|
||||||
|
commandOutput []byte
|
||||||
|
commandError error
|
||||||
|
}
|
||||||
|
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
config HostDNSConfig
|
||||||
|
mockSetup mockSetup
|
||||||
|
wantErr bool
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "successful apply with search domains",
|
||||||
|
config: HostDNSConfig{
|
||||||
|
RouteAll: true,
|
||||||
|
Domains: []DomainConfig{
|
||||||
|
{Domain: "example.com", MatchOnly: false},
|
||||||
|
{Domain: "test.com", MatchOnly: true},
|
||||||
|
},
|
||||||
|
ServerIP: "1.1.1.1",
|
||||||
|
ServerPort: 53,
|
||||||
|
},
|
||||||
|
mockSetup: mockSetup{
|
||||||
|
stateManagerError: nil,
|
||||||
|
commandOutput: []byte(`
|
||||||
|
PrimaryService : ABC123
|
||||||
|
Router : 192.168.1.1
|
||||||
|
DomainName : example.com
|
||||||
|
SearchDomains : <array> {
|
||||||
|
0 : test.com
|
||||||
|
}
|
||||||
|
ServerAddresses : <array> {
|
||||||
|
0 : 1.1.1.1
|
||||||
|
}
|
||||||
|
`),
|
||||||
|
commandError: nil,
|
||||||
|
},
|
||||||
|
wantErr: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "state manager error",
|
||||||
|
config: HostDNSConfig{
|
||||||
|
ServerIP: "1.1.1.1",
|
||||||
|
},
|
||||||
|
mockSetup: mockSetup{
|
||||||
|
stateManagerError: errors.New("state error"),
|
||||||
|
},
|
||||||
|
wantErr: false, // Function does not return an error, it only logs it.
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
// Setup mocks
|
||||||
|
s := &systemConfigurator{
|
||||||
|
createdKeys: make(map[string]struct{}),
|
||||||
|
}
|
||||||
|
|
||||||
|
ctrl := gomock.NewController(t)
|
||||||
|
defer ctrl.Finish() // Ensures all expectations are met
|
||||||
|
|
||||||
|
mockState := mocks.NewMockManager(ctrl)
|
||||||
|
mockCmd := new(MockCommander)
|
||||||
|
|
||||||
|
// Mock UpdateState
|
||||||
|
mockState.EXPECT().UpdateState(gomock.Any()).Return(tt.mockSetup.stateManagerError).AnyTimes()
|
||||||
|
|
||||||
|
// Mock all expected command executions
|
||||||
|
// mockCmd.On("Command", dscacheutilPath, "-flushcache").Return(&exec.Cmd{}).Once()
|
||||||
|
// mockCmd.On("Command", "killall", "-HUP", "mDNSResponder").Return(&exec.Cmd{}).Once()
|
||||||
|
// mockCmd.On("Command", scutilPath).Return(&exec.Cmd{}).Once() // For runSystemConfigCommand
|
||||||
|
|
||||||
|
// Mock `runSystemConfigCommand`
|
||||||
|
originalRunCommand := runSystemConfigCommand
|
||||||
|
runSystemConfigCommand = func(command string) ([]byte, error) {
|
||||||
|
return tt.mockSetup.commandOutput, tt.mockSetup.commandError
|
||||||
|
}
|
||||||
|
defer func() { runSystemConfigCommand = originalRunCommand }()
|
||||||
|
|
||||||
|
err := s.applyDNSConfig(tt.config, mockState)
|
||||||
|
if tt.wantErr {
|
||||||
|
assert.Error(t, err)
|
||||||
|
} else {
|
||||||
|
assert.NoError(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
mockCmd.AssertExpectations(t) // Ensure Command() is called
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGetSystemDNSSettings(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
commandOutput []byte
|
||||||
|
commandError error
|
||||||
|
wantSettings SystemDNSSettings
|
||||||
|
wantErr bool
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "successful retrieval",
|
||||||
|
commandOutput: []byte(`
|
||||||
|
PrimaryService : ABC123
|
||||||
|
Router : 192.168.1.1
|
||||||
|
---
|
||||||
|
DomainName : example.com
|
||||||
|
SearchDomains : <array> {
|
||||||
|
0 : test.com
|
||||||
|
}
|
||||||
|
ServerAddresses : <array> {
|
||||||
|
0 : 1.1.1.1
|
||||||
|
}
|
||||||
|
`),
|
||||||
|
wantSettings: SystemDNSSettings{
|
||||||
|
Domains: []string{"example.com", "test.com"},
|
||||||
|
ServerIP: "1.1.1.1",
|
||||||
|
ServerPort: 53,
|
||||||
|
},
|
||||||
|
wantErr: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "command error",
|
||||||
|
commandError: errors.New("command failed"),
|
||||||
|
wantErr: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
s := &systemConfigurator{
|
||||||
|
createdKeys: make(map[string]struct{}),
|
||||||
|
}
|
||||||
|
|
||||||
|
originalRunCommand := runSystemConfigCommand
|
||||||
|
runSystemConfigCommand = func(command string) ([]byte, error) {
|
||||||
|
return tt.commandOutput, tt.commandError
|
||||||
|
}
|
||||||
|
defer func() { runSystemConfigCommand = originalRunCommand }()
|
||||||
|
|
||||||
|
got, err := s.getSystemDNSSettings()
|
||||||
|
if tt.wantErr {
|
||||||
|
assert.Error(t, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, tt.wantSettings, got)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSupportCustomPort(t *testing.T) {
|
||||||
|
s := &systemConfigurator{}
|
||||||
|
assert.True(t, s.supportCustomPort())
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestString(t *testing.T) {
|
||||||
|
s := &systemConfigurator{}
|
||||||
|
assert.Equal(t, "scutil", s.string())
|
||||||
|
}
|
||||||
@@ -20,7 +20,7 @@ func newHostManager(dnsManager IosDnsManager) (*iosHostManager, error) {
|
|||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a iosHostManager) applyDNSConfig(config HostDNSConfig, _ *statemanager.Manager) error {
|
func (a iosHostManager) applyDNSConfig(config HostDNSConfig, _ statemanager.Manager) error {
|
||||||
jsonData, err := json.Marshal(config)
|
jsonData, err := json.Marshal(config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("marshal: %w", err)
|
return fmt.Errorf("marshal: %w", err)
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ func (r *registryConfigurator) supportCustomPort() bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *registryConfigurator) applyDNSConfig(config HostDNSConfig, stateManager *statemanager.Manager) error {
|
func (r *registryConfigurator) applyDNSConfig(config HostDNSConfig, stateManager statemanager.Manager) error {
|
||||||
if config.RouteAll {
|
if config.RouteAll {
|
||||||
if err := r.addDNSSetupForAll(config.ServerIP); err != nil {
|
if err := r.addDNSSetupForAll(config.ServerIP); err != nil {
|
||||||
return fmt.Errorf("add dns setup: %w", err)
|
return fmt.Errorf("add dns setup: %w", err)
|
||||||
|
|||||||
@@ -103,7 +103,7 @@ func (n *networkManagerDbusConfigurator) supportCustomPort() bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n *networkManagerDbusConfigurator) applyDNSConfig(config HostDNSConfig, stateManager *statemanager.Manager) error {
|
func (n *networkManagerDbusConfigurator) applyDNSConfig(config HostDNSConfig, stateManager statemanager.Manager) error {
|
||||||
connSettings, configVersion, err := n.getAppliedConnectionSettings()
|
connSettings, configVersion, err := n.getAppliedConnectionSettings()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("retrieving the applied connection settings, error: %w", err)
|
return fmt.Errorf("retrieving the applied connection settings, error: %w", err)
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ func (r *resolvconf) supportCustomPort() bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *resolvconf) applyDNSConfig(config HostDNSConfig, stateManager *statemanager.Manager) error {
|
func (r *resolvconf) applyDNSConfig(config HostDNSConfig, stateManager statemanager.Manager) error {
|
||||||
var err error
|
var err error
|
||||||
if !config.RouteAll {
|
if !config.RouteAll {
|
||||||
err = r.restoreHostDNS()
|
err = r.restoreHostDNS()
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ type DefaultServer struct {
|
|||||||
iosDnsManager IosDnsManager
|
iosDnsManager IosDnsManager
|
||||||
|
|
||||||
statusRecorder *peer.Status
|
statusRecorder *peer.Status
|
||||||
stateManager *statemanager.Manager
|
stateManager statemanager.Manager
|
||||||
}
|
}
|
||||||
|
|
||||||
type handlerWithStop interface {
|
type handlerWithStop interface {
|
||||||
@@ -99,7 +99,7 @@ func NewDefaultServer(
|
|||||||
wgInterface WGIface,
|
wgInterface WGIface,
|
||||||
customAddress string,
|
customAddress string,
|
||||||
statusRecorder *peer.Status,
|
statusRecorder *peer.Status,
|
||||||
stateManager *statemanager.Manager,
|
stateManager statemanager.Manager,
|
||||||
disableSys bool,
|
disableSys bool,
|
||||||
) (*DefaultServer, error) {
|
) (*DefaultServer, error) {
|
||||||
var addrPort *netip.AddrPort
|
var addrPort *netip.AddrPort
|
||||||
@@ -161,7 +161,7 @@ func newDefaultServer(
|
|||||||
wgInterface WGIface,
|
wgInterface WGIface,
|
||||||
dnsService service,
|
dnsService service,
|
||||||
statusRecorder *peer.Status,
|
statusRecorder *peer.Status,
|
||||||
stateManager *statemanager.Manager,
|
stateManager statemanager.Manager,
|
||||||
disableSys bool,
|
disableSys bool,
|
||||||
) *DefaultServer {
|
) *DefaultServer {
|
||||||
ctx, stop := context.WithCancel(ctx)
|
ctx, stop := context.WithCancel(ctx)
|
||||||
|
|||||||
@@ -647,7 +647,7 @@ func TestDNSServerUpstreamDeactivateCallback(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var domainsUpdate string
|
var domainsUpdate string
|
||||||
hostManager.applyDNSConfigFunc = func(config HostDNSConfig, statemanager *statemanager.Manager) error {
|
hostManager.applyDNSConfigFunc = func(config HostDNSConfig, statemanager statemanager.Manager) error {
|
||||||
domains := []string{}
|
domains := []string{}
|
||||||
for _, item := range config.Domains {
|
for _, item := range config.Domains {
|
||||||
if item.Disabled {
|
if item.Disabled {
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ func (s *systemdDbusConfigurator) supportCustomPort() bool {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *systemdDbusConfigurator) applyDNSConfig(config HostDNSConfig, stateManager *statemanager.Manager) error {
|
func (s *systemdDbusConfigurator) applyDNSConfig(config HostDNSConfig, stateManager statemanager.Manager) error {
|
||||||
parsedIP, err := netip.ParseAddr(config.ServerIP)
|
parsedIP, err := netip.ParseAddr(config.ServerIP)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("unable to parse ip address, error: %w", err)
|
return fmt.Errorf("unable to parse ip address, error: %w", err)
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ func (s *ShutdownState) Cleanup() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO: move file contents to state manager
|
// TODO: move file contents to state manager
|
||||||
func createUncleanShutdownIndicator(sourcePath string, dnsAddressStr string, stateManager *statemanager.Manager) error {
|
func createUncleanShutdownIndicator(sourcePath string, dnsAddressStr string, stateManager statemanager.Manager) error {
|
||||||
dnsAddress, err := netip.ParseAddr(dnsAddressStr)
|
dnsAddress, err := netip.ParseAddr(dnsAddressStr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("parse dns address %s: %w", dnsAddressStr, err)
|
return fmt.Errorf("parse dns address %s: %w", dnsAddressStr, err)
|
||||||
|
|||||||
@@ -184,7 +184,7 @@ type Engine struct {
|
|||||||
checks []*mgmProto.Checks
|
checks []*mgmProto.Checks
|
||||||
|
|
||||||
relayManager *relayClient.Manager
|
relayManager *relayClient.Manager
|
||||||
stateManager *statemanager.Manager
|
stateManager statemanager.Manager
|
||||||
srWatcher *guard.SRWatcher
|
srWatcher *guard.SRWatcher
|
||||||
|
|
||||||
// Network map persistence
|
// Network map persistence
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ type Manager interface {
|
|||||||
SetRouteChangeListener(listener listener.NetworkChangeListener)
|
SetRouteChangeListener(listener listener.NetworkChangeListener)
|
||||||
InitialRouteRange() []string
|
InitialRouteRange() []string
|
||||||
EnableServerRouter(firewall firewall.Manager) error
|
EnableServerRouter(firewall firewall.Manager) error
|
||||||
Stop(stateManager *statemanager.Manager)
|
Stop(stateManager statemanager.Manager)
|
||||||
}
|
}
|
||||||
|
|
||||||
type ManagerConfig struct {
|
type ManagerConfig struct {
|
||||||
@@ -56,7 +56,7 @@ type ManagerConfig struct {
|
|||||||
StatusRecorder *peer.Status
|
StatusRecorder *peer.Status
|
||||||
RelayManager *relayClient.Manager
|
RelayManager *relayClient.Manager
|
||||||
InitialRoutes []*route.Route
|
InitialRoutes []*route.Route
|
||||||
StateManager *statemanager.Manager
|
StateManager statemanager.Manager
|
||||||
DNSServer dns.Server
|
DNSServer dns.Server
|
||||||
PeerStore *peerstore.Store
|
PeerStore *peerstore.Store
|
||||||
DisableClientRoutes bool
|
DisableClientRoutes bool
|
||||||
@@ -80,7 +80,7 @@ type DefaultManager struct {
|
|||||||
routeRefCounter *refcounter.RouteRefCounter
|
routeRefCounter *refcounter.RouteRefCounter
|
||||||
allowedIPsRefCounter *refcounter.AllowedIPsRefCounter
|
allowedIPsRefCounter *refcounter.AllowedIPsRefCounter
|
||||||
dnsRouteInterval time.Duration
|
dnsRouteInterval time.Duration
|
||||||
stateManager *statemanager.Manager
|
stateManager statemanager.Manager
|
||||||
// clientRoutes is the most recent list of clientRoutes received from the Management Service
|
// clientRoutes is the most recent list of clientRoutes received from the Management Service
|
||||||
clientRoutes route.HAMap
|
clientRoutes route.HAMap
|
||||||
dnsServer dns.Server
|
dnsServer dns.Server
|
||||||
@@ -234,7 +234,7 @@ func (m *DefaultManager) EnableServerRouter(firewall firewall.Manager) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Stop stops the manager watchers and clean firewall rules
|
// Stop stops the manager watchers and clean firewall rules
|
||||||
func (m *DefaultManager) Stop(stateManager *statemanager.Manager) {
|
func (m *DefaultManager) Stop(stateManager statemanager.Manager) {
|
||||||
m.stop()
|
m.stop()
|
||||||
if m.serverRouter != nil {
|
if m.serverRouter != nil {
|
||||||
m.serverRouter.cleanUp()
|
m.serverRouter.cleanUp()
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ type MockManager struct {
|
|||||||
GetRouteSelectorFunc func() *routeselector.RouteSelector
|
GetRouteSelectorFunc func() *routeselector.RouteSelector
|
||||||
GetClientRoutesFunc func() route.HAMap
|
GetClientRoutesFunc func() route.HAMap
|
||||||
GetClientRoutesWithNetIDFunc func() map[route.NetID][]*route.Route
|
GetClientRoutesWithNetIDFunc func() map[route.NetID][]*route.Route
|
||||||
StopFunc func(manager *statemanager.Manager)
|
StopFunc func(manager statemanager.Manager)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *MockManager) Init() (net.AddHookFunc, net.RemoveHookFunc, error) {
|
func (m *MockManager) Init() (net.AddHookFunc, net.RemoveHookFunc, error) {
|
||||||
@@ -83,7 +83,7 @@ func (m *MockManager) EnableServerRouter(firewall firewall.Manager) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Stop mock implementation of Stop from Manager interface
|
// Stop mock implementation of Stop from Manager interface
|
||||||
func (m *MockManager) Stop(stateManager *statemanager.Manager) {
|
func (m *MockManager) Stop(stateManager statemanager.Manager) {
|
||||||
if m.StopFunc != nil {
|
if m.StopFunc != nil {
|
||||||
m.StopFunc(stateManager)
|
m.StopFunc(stateManager)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,11 +13,11 @@ import (
|
|||||||
nbnet "github.com/netbirdio/netbird/util/net"
|
nbnet "github.com/netbirdio/netbird/util/net"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (r *SysOps) SetupRouting([]net.IP, *statemanager.Manager) (nbnet.AddHookFunc, nbnet.RemoveHookFunc, error) {
|
func (r *SysOps) SetupRouting([]net.IP, statemanager.Manager) (nbnet.AddHookFunc, nbnet.RemoveHookFunc, error) {
|
||||||
return nil, nil, nil
|
return nil, nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *SysOps) CleanupRouting(*statemanager.Manager) error {
|
func (r *SysOps) CleanupRouting(statemanager.Manager) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ var splitDefaultv6_2 = netip.PrefixFrom(netip.AddrFrom16([16]byte{0x80}), 1)
|
|||||||
|
|
||||||
var ErrRoutingIsSeparate = errors.New("routing is separate")
|
var ErrRoutingIsSeparate = errors.New("routing is separate")
|
||||||
|
|
||||||
func (r *SysOps) setupRefCounter(initAddresses []net.IP, stateManager *statemanager.Manager) (nbnet.AddHookFunc, nbnet.RemoveHookFunc, error) {
|
func (r *SysOps) setupRefCounter(initAddresses []net.IP, stateManager statemanager.Manager) (nbnet.AddHookFunc, nbnet.RemoveHookFunc, error) {
|
||||||
stateManager.RegisterState(&ShutdownState{})
|
stateManager.RegisterState(&ShutdownState{})
|
||||||
|
|
||||||
initialNextHopV4, err := GetNextHop(netip.IPv4Unspecified())
|
initialNextHopV4, err := GetNextHop(netip.IPv4Unspecified())
|
||||||
@@ -80,13 +80,13 @@ func (r *SysOps) setupRefCounter(initAddresses []net.IP, stateManager *statemana
|
|||||||
}
|
}
|
||||||
|
|
||||||
// updateState updates state on every change so it will be persisted regularly
|
// updateState updates state on every change so it will be persisted regularly
|
||||||
func (r *SysOps) updateState(stateManager *statemanager.Manager) {
|
func (r *SysOps) updateState(stateManager statemanager.Manager) {
|
||||||
if err := stateManager.UpdateState((*ShutdownState)(r.refCounter)); err != nil {
|
if err := stateManager.UpdateState((*ShutdownState)(r.refCounter)); err != nil {
|
||||||
log.Errorf("failed to update state: %v", err)
|
log.Errorf("failed to update state: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *SysOps) cleanupRefCounter(stateManager *statemanager.Manager) error {
|
func (r *SysOps) cleanupRefCounter(stateManager statemanager.Manager) error {
|
||||||
if r.refCounter == nil {
|
if r.refCounter == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -337,7 +337,7 @@ func (r *SysOps) genericRemoveVPNRoute(prefix netip.Prefix, intf *net.Interface)
|
|||||||
return r.removeFromRouteTable(prefix, nextHop)
|
return r.removeFromRouteTable(prefix, nextHop)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *SysOps) setupHooks(initAddresses []net.IP, stateManager *statemanager.Manager) (nbnet.AddHookFunc, nbnet.RemoveHookFunc, error) {
|
func (r *SysOps) setupHooks(initAddresses []net.IP, stateManager statemanager.Manager) (nbnet.AddHookFunc, nbnet.RemoveHookFunc, error) {
|
||||||
beforeHook := func(connID nbnet.ConnectionID, ip net.IP) error {
|
beforeHook := func(connID nbnet.ConnectionID, ip net.IP) error {
|
||||||
prefix, err := util.GetPrefixFromIP(ip)
|
prefix, err := util.GetPrefixFromIP(ip)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -13,14 +13,14 @@ import (
|
|||||||
nbnet "github.com/netbirdio/netbird/util/net"
|
nbnet "github.com/netbirdio/netbird/util/net"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (r *SysOps) SetupRouting([]net.IP, *statemanager.Manager) (nbnet.AddHookFunc, nbnet.RemoveHookFunc, error) {
|
func (r *SysOps) SetupRouting([]net.IP, statemanager.Manager) (nbnet.AddHookFunc, nbnet.RemoveHookFunc, error) {
|
||||||
r.mu.Lock()
|
r.mu.Lock()
|
||||||
defer r.mu.Unlock()
|
defer r.mu.Unlock()
|
||||||
r.prefixes = make(map[netip.Prefix]struct{})
|
r.prefixes = make(map[netip.Prefix]struct{})
|
||||||
return nil, nil, nil
|
return nil, nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *SysOps) CleanupRouting(*statemanager.Manager) error {
|
func (r *SysOps) CleanupRouting(statemanager.Manager) error {
|
||||||
r.mu.Lock()
|
r.mu.Lock()
|
||||||
defer r.mu.Unlock()
|
defer r.mu.Unlock()
|
||||||
|
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ func getSetupRules() []ruleParams {
|
|||||||
// Rule 2 (VPN Traffic Routing): Directs all remaining traffic to the 'NetbirdVPNTableID' custom routing table.
|
// Rule 2 (VPN Traffic Routing): Directs all remaining traffic to the 'NetbirdVPNTableID' custom routing table.
|
||||||
// This table is where a default route or other specific routes received from the management server are configured,
|
// This table is where a default route or other specific routes received from the management server are configured,
|
||||||
// enabling VPN connectivity.
|
// enabling VPN connectivity.
|
||||||
func (r *SysOps) SetupRouting(initAddresses []net.IP, stateManager *statemanager.Manager) (_ nbnet.AddHookFunc, _ nbnet.RemoveHookFunc, err error) {
|
func (r *SysOps) SetupRouting(initAddresses []net.IP, stateManager statemanager.Manager) (_ nbnet.AddHookFunc, _ nbnet.RemoveHookFunc, err error) {
|
||||||
if !nbnet.AdvancedRouting() {
|
if !nbnet.AdvancedRouting() {
|
||||||
log.Infof("Using legacy routing setup")
|
log.Infof("Using legacy routing setup")
|
||||||
return r.setupRefCounter(initAddresses, stateManager)
|
return r.setupRefCounter(initAddresses, stateManager)
|
||||||
@@ -110,7 +110,7 @@ func (r *SysOps) SetupRouting(initAddresses []net.IP, stateManager *statemanager
|
|||||||
// CleanupRouting performs a thorough cleanup of the routing configuration established by 'setupRouting'.
|
// CleanupRouting performs a thorough cleanup of the routing configuration established by 'setupRouting'.
|
||||||
// It systematically removes the three rules and any associated routing table entries to ensure a clean state.
|
// It systematically removes the three rules and any associated routing table entries to ensure a clean state.
|
||||||
// The function uses error aggregation to report any errors encountered during the cleanup process.
|
// The function uses error aggregation to report any errors encountered during the cleanup process.
|
||||||
func (r *SysOps) CleanupRouting(stateManager *statemanager.Manager) error {
|
func (r *SysOps) CleanupRouting(stateManager statemanager.Manager) error {
|
||||||
if !nbnet.AdvancedRouting() {
|
if !nbnet.AdvancedRouting() {
|
||||||
return r.cleanupRefCounter(stateManager)
|
return r.cleanupRefCounter(stateManager)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,11 +17,11 @@ import (
|
|||||||
nbnet "github.com/netbirdio/netbird/util/net"
|
nbnet "github.com/netbirdio/netbird/util/net"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (r *SysOps) SetupRouting(initAddresses []net.IP, stateManager *statemanager.Manager) (nbnet.AddHookFunc, nbnet.RemoveHookFunc, error) {
|
func (r *SysOps) SetupRouting(initAddresses []net.IP, stateManager statemanager.Manager) (nbnet.AddHookFunc, nbnet.RemoveHookFunc, error) {
|
||||||
return r.setupRefCounter(initAddresses, stateManager)
|
return r.setupRefCounter(initAddresses, stateManager)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *SysOps) CleanupRouting(stateManager *statemanager.Manager) error {
|
func (r *SysOps) CleanupRouting(stateManager statemanager.Manager) error {
|
||||||
return r.cleanupRefCounter(stateManager)
|
return r.cleanupRefCounter(stateManager)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -131,11 +131,11 @@ const (
|
|||||||
RouteDeleted
|
RouteDeleted
|
||||||
)
|
)
|
||||||
|
|
||||||
func (r *SysOps) SetupRouting(initAddresses []net.IP, stateManager *statemanager.Manager) (nbnet.AddHookFunc, nbnet.RemoveHookFunc, error) {
|
func (r *SysOps) SetupRouting(initAddresses []net.IP, stateManager statemanager.Manager) (nbnet.AddHookFunc, nbnet.RemoveHookFunc, error) {
|
||||||
return r.setupRefCounter(initAddresses, stateManager)
|
return r.setupRefCounter(initAddresses, stateManager)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *SysOps) CleanupRouting(stateManager *statemanager.Manager) error {
|
func (r *SysOps) CleanupRouting(stateManager statemanager.Manager) error {
|
||||||
return r.cleanupRefCounter(stateManager)
|
return r.cleanupRefCounter(stateManager)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -49,8 +49,25 @@ func (r *RawState) MarshalJSON() ([]byte, error) {
|
|||||||
return r.data, nil
|
return r.data, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Manager is the interface that exposes the persistence and state management methods.
|
||||||
|
type Manager interface {
|
||||||
|
Start()
|
||||||
|
Stop(ctx context.Context) error
|
||||||
|
RegisterState(state State)
|
||||||
|
GetState(state State) State
|
||||||
|
UpdateState(state State) error
|
||||||
|
DeleteState(state State) error
|
||||||
|
DeleteStateByName(stateName string) error
|
||||||
|
DeleteAllStates() (int, error)
|
||||||
|
PersistState(ctx context.Context) error
|
||||||
|
LoadState(state State) error
|
||||||
|
CleanupStateByName(name string) error
|
||||||
|
PerformCleanup() error
|
||||||
|
GetSavedStateNames() ([]string, error)
|
||||||
|
}
|
||||||
|
|
||||||
// Manager handles the persistence and management of various states
|
// Manager handles the persistence and management of various states
|
||||||
type Manager struct {
|
type managerImpl struct {
|
||||||
mu sync.Mutex
|
mu sync.Mutex
|
||||||
cancel context.CancelFunc
|
cancel context.CancelFunc
|
||||||
done chan struct{}
|
done chan struct{}
|
||||||
@@ -65,8 +82,8 @@ type Manager struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// New creates a new Manager instance
|
// New creates a new Manager instance
|
||||||
func New(filePath string) *Manager {
|
func New(filePath string) Manager {
|
||||||
return &Manager{
|
return &managerImpl{
|
||||||
filePath: filePath,
|
filePath: filePath,
|
||||||
states: make(map[string]State),
|
states: make(map[string]State),
|
||||||
dirty: make(map[string]struct{}),
|
dirty: make(map[string]struct{}),
|
||||||
@@ -75,7 +92,7 @@ func New(filePath string) *Manager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Start starts the state manager periodic save routine
|
// Start starts the state manager periodic save routine
|
||||||
func (m *Manager) Start() {
|
func (m *managerImpl) Start() {
|
||||||
if m == nil {
|
if m == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -90,7 +107,7 @@ func (m *Manager) Start() {
|
|||||||
go m.periodicStateSave(ctx)
|
go m.periodicStateSave(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Manager) Stop(ctx context.Context) error {
|
func (m *managerImpl) Stop(ctx context.Context) error {
|
||||||
if m == nil {
|
if m == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -114,7 +131,7 @@ func (m *Manager) Stop(ctx context.Context) error {
|
|||||||
|
|
||||||
// RegisterState registers a state with the manager but doesn't attempt to persist it.
|
// RegisterState registers a state with the manager but doesn't attempt to persist it.
|
||||||
// Pass an uninitialized state to register it.
|
// Pass an uninitialized state to register it.
|
||||||
func (m *Manager) RegisterState(state State) {
|
func (m *managerImpl) RegisterState(state State) {
|
||||||
if m == nil {
|
if m == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -128,7 +145,7 @@ func (m *Manager) RegisterState(state State) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// GetState returns the state for the given type
|
// GetState returns the state for the given type
|
||||||
func (m *Manager) GetState(state State) State {
|
func (m *managerImpl) GetState(state State) State {
|
||||||
if m == nil {
|
if m == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -141,7 +158,7 @@ func (m *Manager) GetState(state State) State {
|
|||||||
|
|
||||||
// UpdateState updates the state in the manager and marks it as dirty for the next save.
|
// UpdateState updates the state in the manager and marks it as dirty for the next save.
|
||||||
// The state will be replaced with the new one.
|
// The state will be replaced with the new one.
|
||||||
func (m *Manager) UpdateState(state State) error {
|
func (m *managerImpl) UpdateState(state State) error {
|
||||||
if m == nil {
|
if m == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -151,7 +168,7 @@ func (m *Manager) UpdateState(state State) error {
|
|||||||
|
|
||||||
// DeleteState removes the state from the manager and marks it as dirty for the next save.
|
// DeleteState removes the state from the manager and marks it as dirty for the next save.
|
||||||
// Pass an uninitialized state to delete it.
|
// Pass an uninitialized state to delete it.
|
||||||
func (m *Manager) DeleteState(state State) error {
|
func (m *managerImpl) DeleteState(state State) error {
|
||||||
if m == nil {
|
if m == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -159,7 +176,7 @@ func (m *Manager) DeleteState(state State) error {
|
|||||||
return m.setState(state.Name(), nil)
|
return m.setState(state.Name(), nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Manager) setState(name string, state State) error {
|
func (m *managerImpl) setState(name string, state State) error {
|
||||||
m.mu.Lock()
|
m.mu.Lock()
|
||||||
defer m.mu.Unlock()
|
defer m.mu.Unlock()
|
||||||
|
|
||||||
@@ -175,7 +192,7 @@ func (m *Manager) setState(name string, state State) error {
|
|||||||
|
|
||||||
// DeleteStateByName handles deletion of states without cleanup.
|
// DeleteStateByName handles deletion of states without cleanup.
|
||||||
// It doesn't require the state to be registered.
|
// It doesn't require the state to be registered.
|
||||||
func (m *Manager) DeleteStateByName(stateName string) error {
|
func (m *managerImpl) DeleteStateByName(stateName string) error {
|
||||||
if m == nil {
|
if m == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -203,7 +220,7 @@ func (m *Manager) DeleteStateByName(stateName string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// DeleteAllStates removes all states.
|
// DeleteAllStates removes all states.
|
||||||
func (m *Manager) DeleteAllStates() (int, error) {
|
func (m *managerImpl) DeleteAllStates() (int, error) {
|
||||||
if m == nil {
|
if m == nil {
|
||||||
return 0, nil
|
return 0, nil
|
||||||
}
|
}
|
||||||
@@ -230,7 +247,7 @@ func (m *Manager) DeleteAllStates() (int, error) {
|
|||||||
return count, nil
|
return count, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Manager) periodicStateSave(ctx context.Context) {
|
func (m *managerImpl) periodicStateSave(ctx context.Context) {
|
||||||
ticker := time.NewTicker(10 * time.Second)
|
ticker := time.NewTicker(10 * time.Second)
|
||||||
defer ticker.Stop()
|
defer ticker.Stop()
|
||||||
defer close(m.done)
|
defer close(m.done)
|
||||||
@@ -248,7 +265,7 @@ func (m *Manager) periodicStateSave(ctx context.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// PersistState persists the states that have been updated since the last save.
|
// PersistState persists the states that have been updated since the last save.
|
||||||
func (m *Manager) PersistState(ctx context.Context) error {
|
func (m *managerImpl) PersistState(ctx context.Context) error {
|
||||||
if m == nil {
|
if m == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -291,7 +308,7 @@ func (m *Manager) PersistState(ctx context.Context) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// loadStateFile reads and unmarshals the state file into a map of raw JSON messages
|
// loadStateFile reads and unmarshals the state file into a map of raw JSON messages
|
||||||
func (m *Manager) loadStateFile(deleteCorrupt bool) (map[string]json.RawMessage, error) {
|
func (m *managerImpl) loadStateFile(deleteCorrupt bool) (map[string]json.RawMessage, error) {
|
||||||
data, err := os.ReadFile(m.filePath)
|
data, err := os.ReadFile(m.filePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if errors.Is(err, fs.ErrNotExist) {
|
if errors.Is(err, fs.ErrNotExist) {
|
||||||
@@ -311,7 +328,7 @@ func (m *Manager) loadStateFile(deleteCorrupt bool) (map[string]json.RawMessage,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// handleCorruptedState creates a backup of a corrupted state file by moving it
|
// handleCorruptedState creates a backup of a corrupted state file by moving it
|
||||||
func (m *Manager) handleCorruptedState(deleteCorrupt bool) {
|
func (m *managerImpl) handleCorruptedState(deleteCorrupt bool) {
|
||||||
if !deleteCorrupt {
|
if !deleteCorrupt {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -327,7 +344,7 @@ func (m *Manager) handleCorruptedState(deleteCorrupt bool) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// loadSingleRawState unmarshals a raw state into a concrete state object
|
// loadSingleRawState unmarshals a raw state into a concrete state object
|
||||||
func (m *Manager) loadSingleRawState(name string, rawState json.RawMessage) (State, error) {
|
func (m *managerImpl) loadSingleRawState(name string, rawState json.RawMessage) (State, error) {
|
||||||
stateType, ok := m.stateTypes[name]
|
stateType, ok := m.stateTypes[name]
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, fmt.Errorf(errStateNotRegistered, name)
|
return nil, fmt.Errorf(errStateNotRegistered, name)
|
||||||
@@ -346,7 +363,7 @@ func (m *Manager) loadSingleRawState(name string, rawState json.RawMessage) (Sta
|
|||||||
}
|
}
|
||||||
|
|
||||||
// LoadState loads a specific state from the state file
|
// LoadState loads a specific state from the state file
|
||||||
func (m *Manager) LoadState(state State) error {
|
func (m *managerImpl) LoadState(state State) error {
|
||||||
if m == nil {
|
if m == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -383,7 +400,7 @@ func (m *Manager) LoadState(state State) error {
|
|||||||
|
|
||||||
// cleanupSingleState handles the cleanup of a specific state and returns any error.
|
// cleanupSingleState handles the cleanup of a specific state and returns any error.
|
||||||
// The caller must hold the mutex.
|
// The caller must hold the mutex.
|
||||||
func (m *Manager) cleanupSingleState(name string, rawState json.RawMessage) error {
|
func (m *managerImpl) cleanupSingleState(name string, rawState json.RawMessage) error {
|
||||||
// For unregistered states, preserve the raw JSON
|
// For unregistered states, preserve the raw JSON
|
||||||
if _, registered := m.stateTypes[name]; !registered {
|
if _, registered := m.stateTypes[name]; !registered {
|
||||||
m.states[name] = &RawState{data: rawState}
|
m.states[name] = &RawState{data: rawState}
|
||||||
@@ -424,7 +441,7 @@ func (m *Manager) cleanupSingleState(name string, rawState json.RawMessage) erro
|
|||||||
|
|
||||||
// CleanupStateByName loads and cleans up a specific state by name if it implements CleanableState.
|
// CleanupStateByName loads and cleans up a specific state by name if it implements CleanableState.
|
||||||
// Returns an error if the state doesn't exist, isn't registered, or cleanup fails.
|
// Returns an error if the state doesn't exist, isn't registered, or cleanup fails.
|
||||||
func (m *Manager) CleanupStateByName(name string) error {
|
func (m *managerImpl) CleanupStateByName(name string) error {
|
||||||
if m == nil {
|
if m == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -461,7 +478,7 @@ func (m *Manager) CleanupStateByName(name string) error {
|
|||||||
|
|
||||||
// PerformCleanup retrieves all states from the state file and calls Cleanup on registered states that support it.
|
// PerformCleanup retrieves all states from the state file and calls Cleanup on registered states that support it.
|
||||||
// Unregistered states are preserved in their original state.
|
// Unregistered states are preserved in their original state.
|
||||||
func (m *Manager) PerformCleanup() error {
|
func (m *managerImpl) PerformCleanup() error {
|
||||||
if m == nil {
|
if m == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -491,7 +508,7 @@ func (m *Manager) PerformCleanup() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// GetSavedStateNames returns all state names that are currently saved in the state file.
|
// GetSavedStateNames returns all state names that are currently saved in the state file.
|
||||||
func (m *Manager) GetSavedStateNames() ([]string, error) {
|
func (m *managerImpl) GetSavedStateNames() ([]string, error) {
|
||||||
if m == nil {
|
if m == nil {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,312 @@
|
|||||||
|
// Code generated by MockGen. DO NOT EDIT.
|
||||||
|
// Source: client/internal/statemanager/manager.go
|
||||||
|
//
|
||||||
|
// Generated by this command:
|
||||||
|
//
|
||||||
|
// mockgen -source client/internal/statemanager/manager.go -destination lient/internal/statemanager/manager_mock.go Manager
|
||||||
|
//
|
||||||
|
|
||||||
|
// Package mocks is a generated GoMock package.
|
||||||
|
package mocks
|
||||||
|
|
||||||
|
import (
|
||||||
|
context "context"
|
||||||
|
reflect "reflect"
|
||||||
|
|
||||||
|
statemanager "github.com/netbirdio/netbird/client/internal/statemanager"
|
||||||
|
gomock "go.uber.org/mock/gomock"
|
||||||
|
)
|
||||||
|
|
||||||
|
// MockState is a mock of State interface.
|
||||||
|
type MockState struct {
|
||||||
|
ctrl *gomock.Controller
|
||||||
|
recorder *MockStateMockRecorder
|
||||||
|
isgomock struct{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MockStateMockRecorder is the mock recorder for MockState.
|
||||||
|
type MockStateMockRecorder struct {
|
||||||
|
mock *MockState
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewMockState creates a new mock instance.
|
||||||
|
func NewMockState(ctrl *gomock.Controller) *MockState {
|
||||||
|
mock := &MockState{ctrl: ctrl}
|
||||||
|
mock.recorder = &MockStateMockRecorder{mock}
|
||||||
|
return mock
|
||||||
|
}
|
||||||
|
|
||||||
|
// EXPECT returns an object that allows the caller to indicate expected use.
|
||||||
|
func (m *MockState) EXPECT() *MockStateMockRecorder {
|
||||||
|
return m.recorder
|
||||||
|
}
|
||||||
|
|
||||||
|
// Name mocks base method.
|
||||||
|
func (m *MockState) Name() string {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "Name")
|
||||||
|
ret0, _ := ret[0].(string)
|
||||||
|
return ret0
|
||||||
|
}
|
||||||
|
|
||||||
|
// Name indicates an expected call of Name.
|
||||||
|
func (mr *MockStateMockRecorder) Name() *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Name", reflect.TypeOf((*MockState)(nil).Name))
|
||||||
|
}
|
||||||
|
|
||||||
|
// MockCleanableState is a mock of CleanableState interface.
|
||||||
|
type MockCleanableState struct {
|
||||||
|
ctrl *gomock.Controller
|
||||||
|
recorder *MockCleanableStateMockRecorder
|
||||||
|
isgomock struct{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MockCleanableStateMockRecorder is the mock recorder for MockCleanableState.
|
||||||
|
type MockCleanableStateMockRecorder struct {
|
||||||
|
mock *MockCleanableState
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewMockCleanableState creates a new mock instance.
|
||||||
|
func NewMockCleanableState(ctrl *gomock.Controller) *MockCleanableState {
|
||||||
|
mock := &MockCleanableState{ctrl: ctrl}
|
||||||
|
mock.recorder = &MockCleanableStateMockRecorder{mock}
|
||||||
|
return mock
|
||||||
|
}
|
||||||
|
|
||||||
|
// EXPECT returns an object that allows the caller to indicate expected use.
|
||||||
|
func (m *MockCleanableState) EXPECT() *MockCleanableStateMockRecorder {
|
||||||
|
return m.recorder
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cleanup mocks base method.
|
||||||
|
func (m *MockCleanableState) Cleanup() error {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "Cleanup")
|
||||||
|
ret0, _ := ret[0].(error)
|
||||||
|
return ret0
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cleanup indicates an expected call of Cleanup.
|
||||||
|
func (mr *MockCleanableStateMockRecorder) Cleanup() *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Cleanup", reflect.TypeOf((*MockCleanableState)(nil).Cleanup))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Name mocks base method.
|
||||||
|
func (m *MockCleanableState) Name() string {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "Name")
|
||||||
|
ret0, _ := ret[0].(string)
|
||||||
|
return ret0
|
||||||
|
}
|
||||||
|
|
||||||
|
// Name indicates an expected call of Name.
|
||||||
|
func (mr *MockCleanableStateMockRecorder) Name() *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Name", reflect.TypeOf((*MockCleanableState)(nil).Name))
|
||||||
|
}
|
||||||
|
|
||||||
|
// MockManager is a mock of Manager interface.
|
||||||
|
type MockManager struct {
|
||||||
|
ctrl *gomock.Controller
|
||||||
|
recorder *MockManagerMockRecorder
|
||||||
|
isgomock struct{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MockManagerMockRecorder is the mock recorder for MockManager.
|
||||||
|
type MockManagerMockRecorder struct {
|
||||||
|
mock *MockManager
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewMockManager creates a new mock instance.
|
||||||
|
func NewMockManager(ctrl *gomock.Controller) *MockManager {
|
||||||
|
mock := &MockManager{ctrl: ctrl}
|
||||||
|
mock.recorder = &MockManagerMockRecorder{mock}
|
||||||
|
return mock
|
||||||
|
}
|
||||||
|
|
||||||
|
// EXPECT returns an object that allows the caller to indicate expected use.
|
||||||
|
func (m *MockManager) EXPECT() *MockManagerMockRecorder {
|
||||||
|
return m.recorder
|
||||||
|
}
|
||||||
|
|
||||||
|
// CleanupStateByName mocks base method.
|
||||||
|
func (m *MockManager) CleanupStateByName(name string) error {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "CleanupStateByName", name)
|
||||||
|
ret0, _ := ret[0].(error)
|
||||||
|
return ret0
|
||||||
|
}
|
||||||
|
|
||||||
|
// CleanupStateByName indicates an expected call of CleanupStateByName.
|
||||||
|
func (mr *MockManagerMockRecorder) CleanupStateByName(name any) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CleanupStateByName", reflect.TypeOf((*MockManager)(nil).CleanupStateByName), name)
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteAllStates mocks base method.
|
||||||
|
func (m *MockManager) DeleteAllStates() (int, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "DeleteAllStates")
|
||||||
|
ret0, _ := ret[0].(int)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteAllStates indicates an expected call of DeleteAllStates.
|
||||||
|
func (mr *MockManagerMockRecorder) DeleteAllStates() *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteAllStates", reflect.TypeOf((*MockManager)(nil).DeleteAllStates))
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteState mocks base method.
|
||||||
|
func (m *MockManager) DeleteState(state statemanager.State) error {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "DeleteState", state)
|
||||||
|
ret0, _ := ret[0].(error)
|
||||||
|
return ret0
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteState indicates an expected call of DeleteState.
|
||||||
|
func (mr *MockManagerMockRecorder) DeleteState(state any) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteState", reflect.TypeOf((*MockManager)(nil).DeleteState), state)
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteStateByName mocks base method.
|
||||||
|
func (m *MockManager) DeleteStateByName(stateName string) error {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "DeleteStateByName", stateName)
|
||||||
|
ret0, _ := ret[0].(error)
|
||||||
|
return ret0
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteStateByName indicates an expected call of DeleteStateByName.
|
||||||
|
func (mr *MockManagerMockRecorder) DeleteStateByName(stateName any) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteStateByName", reflect.TypeOf((*MockManager)(nil).DeleteStateByName), stateName)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetSavedStateNames mocks base method.
|
||||||
|
func (m *MockManager) GetSavedStateNames() ([]string, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "GetSavedStateNames")
|
||||||
|
ret0, _ := ret[0].([]string)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetSavedStateNames indicates an expected call of GetSavedStateNames.
|
||||||
|
func (mr *MockManagerMockRecorder) GetSavedStateNames() *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSavedStateNames", reflect.TypeOf((*MockManager)(nil).GetSavedStateNames))
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetState mocks base method.
|
||||||
|
func (m *MockManager) GetState(state statemanager.State) statemanager.State {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "GetState", state)
|
||||||
|
ret0, _ := ret[0].(statemanager.State)
|
||||||
|
return ret0
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetState indicates an expected call of GetState.
|
||||||
|
func (mr *MockManagerMockRecorder) GetState(state any) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetState", reflect.TypeOf((*MockManager)(nil).GetState), state)
|
||||||
|
}
|
||||||
|
|
||||||
|
// LoadState mocks base method.
|
||||||
|
func (m *MockManager) LoadState(state statemanager.State) error {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "LoadState", state)
|
||||||
|
ret0, _ := ret[0].(error)
|
||||||
|
return ret0
|
||||||
|
}
|
||||||
|
|
||||||
|
// LoadState indicates an expected call of LoadState.
|
||||||
|
func (mr *MockManagerMockRecorder) LoadState(state any) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LoadState", reflect.TypeOf((*MockManager)(nil).LoadState), state)
|
||||||
|
}
|
||||||
|
|
||||||
|
// PerformCleanup mocks base method.
|
||||||
|
func (m *MockManager) PerformCleanup() error {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "PerformCleanup")
|
||||||
|
ret0, _ := ret[0].(error)
|
||||||
|
return ret0
|
||||||
|
}
|
||||||
|
|
||||||
|
// PerformCleanup indicates an expected call of PerformCleanup.
|
||||||
|
func (mr *MockManagerMockRecorder) PerformCleanup() *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PerformCleanup", reflect.TypeOf((*MockManager)(nil).PerformCleanup))
|
||||||
|
}
|
||||||
|
|
||||||
|
// PersistState mocks base method.
|
||||||
|
func (m *MockManager) PersistState(ctx context.Context) error {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "PersistState", ctx)
|
||||||
|
ret0, _ := ret[0].(error)
|
||||||
|
return ret0
|
||||||
|
}
|
||||||
|
|
||||||
|
// PersistState indicates an expected call of PersistState.
|
||||||
|
func (mr *MockManagerMockRecorder) PersistState(ctx any) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PersistState", reflect.TypeOf((*MockManager)(nil).PersistState), ctx)
|
||||||
|
}
|
||||||
|
|
||||||
|
// RegisterState mocks base method.
|
||||||
|
func (m *MockManager) RegisterState(state statemanager.State) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
m.ctrl.Call(m, "RegisterState", state)
|
||||||
|
}
|
||||||
|
|
||||||
|
// RegisterState indicates an expected call of RegisterState.
|
||||||
|
func (mr *MockManagerMockRecorder) RegisterState(state any) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RegisterState", reflect.TypeOf((*MockManager)(nil).RegisterState), state)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start mocks base method.
|
||||||
|
func (m *MockManager) Start() {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
m.ctrl.Call(m, "Start")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start indicates an expected call of Start.
|
||||||
|
func (mr *MockManagerMockRecorder) Start() *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Start", reflect.TypeOf((*MockManager)(nil).Start))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Stop mocks base method.
|
||||||
|
func (m *MockManager) Stop(ctx context.Context) error {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "Stop", ctx)
|
||||||
|
ret0, _ := ret[0].(error)
|
||||||
|
return ret0
|
||||||
|
}
|
||||||
|
|
||||||
|
// Stop indicates an expected call of Stop.
|
||||||
|
func (mr *MockManagerMockRecorder) Stop(ctx any) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Stop", reflect.TypeOf((*MockManager)(nil).Stop), ctx)
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateState mocks base method.
|
||||||
|
func (m *MockManager) UpdateState(state statemanager.State) error {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "UpdateState", state)
|
||||||
|
ret0, _ := ret[0].(error)
|
||||||
|
return ret0
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateState indicates an expected call of UpdateState.
|
||||||
|
func (mr *MockManagerMockRecorder) UpdateState(state any) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateState", reflect.TypeOf((*MockManager)(nil).UpdateState), state)
|
||||||
|
}
|
||||||
@@ -8,7 +8,7 @@ import (
|
|||||||
"github.com/netbirdio/netbird/client/internal/statemanager"
|
"github.com/netbirdio/netbird/client/internal/statemanager"
|
||||||
)
|
)
|
||||||
|
|
||||||
func registerStates(mgr *statemanager.Manager) {
|
func registerStates(mgr statemanager.Manager) {
|
||||||
mgr.RegisterState(&dns.ShutdownState{})
|
mgr.RegisterState(&dns.ShutdownState{})
|
||||||
mgr.RegisterState(&systemops.ShutdownState{})
|
mgr.RegisterState(&systemops.ShutdownState{})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import (
|
|||||||
"github.com/netbirdio/netbird/client/internal/statemanager"
|
"github.com/netbirdio/netbird/client/internal/statemanager"
|
||||||
)
|
)
|
||||||
|
|
||||||
func registerStates(mgr *statemanager.Manager) {
|
func registerStates(mgr statemanager.Manager) {
|
||||||
mgr.RegisterState(&dns.ShutdownState{})
|
mgr.RegisterState(&dns.ShutdownState{})
|
||||||
mgr.RegisterState(&systemops.ShutdownState{})
|
mgr.RegisterState(&systemops.ShutdownState{})
|
||||||
mgr.RegisterState(&nftables.ShutdownState{})
|
mgr.RegisterState(&nftables.ShutdownState{})
|
||||||
|
|||||||
Reference in New Issue
Block a user