@@ -8,19 +8,21 @@ import (
88 "go.uber.org/zap"
99)
1010
11- // FakeManager provides an in-memory SNAT rule manager for non-Linux systems.
11+ // FakeManager provides an in-memory SNAT and FORWARD rule manager for non-Linux systems.
1212// It simulates iptables behavior for development and testing on macOS.
1313type FakeManager struct {
14- managed map [string ]SNATRule
15- mu sync.Mutex
16- logger * zap.Logger
14+ managed map [string ]SNATRule
15+ managedForward map [string ]ForwardRule
16+ mu sync.Mutex
17+ logger * zap.Logger
1718}
1819
1920// NewManager creates a fake in-memory SNAT Manager for non-Linux systems.
2021func NewManager (logger * zap.Logger ) (Manager , error ) {
2122 return & FakeManager {
22- managed : make (map [string ]SNATRule ),
23- logger : logger ,
23+ managed : make (map [string ]SNATRule ),
24+ managedForward : make (map [string ]ForwardRule ),
25+ logger : logger ,
2426 }, nil
2527}
2628
@@ -55,17 +57,48 @@ func (m *FakeManager) Reconcile(desired []SNATRule) error {
5557 return nil
5658}
5759
58- // Cleanup removes all managed SNAT rules from memory.
60+ // ReconcileForward compares desired FORWARD rules with the currently managed set in memory.
61+ func (m * FakeManager ) ReconcileForward (desired []ForwardRule ) error {
62+ m .mu .Lock ()
63+ defer m .mu .Unlock ()
64+
65+ desiredMap := make (map [string ]ForwardRule , len (desired ))
66+ for _ , rule := range desired {
67+ desiredMap [rule .Key ()] = rule
68+ }
69+
70+ // Remove stale rules
71+ for key := range m .managedForward {
72+ if _ , exists := desiredMap [key ]; ! exists {
73+ delete (m .managedForward , key )
74+ m .logger .Debug ("fake: deleted FORWARD rule" , zap .String ("key" , key ))
75+ }
76+ }
77+
78+ // Add missing rules
79+ for key , rule := range desiredMap {
80+ if _ , exists := m .managedForward [key ]; exists {
81+ continue
82+ }
83+ m .managedForward [key ] = rule
84+ m .logger .Debug ("fake: added FORWARD rule" , zap .String ("key" , key ))
85+ }
86+
87+ return nil
88+ }
89+
90+ // Cleanup removes all managed SNAT and FORWARD rules from memory.
5991func (m * FakeManager ) Cleanup () error {
6092 m .mu .Lock ()
6193 defer m .mu .Unlock ()
6294
6395 m .managed = make (map [string ]SNATRule )
64- m .logger .Debug ("fake: cleaned up all SNAT rules" )
96+ m .managedForward = make (map [string ]ForwardRule )
97+ m .logger .Debug ("fake: cleaned up all SNAT and FORWARD rules" )
6598 return nil
6699}
67100
68- // GetManaged returns a copy of the currently managed rules (for testing).
101+ // GetManaged returns a copy of the currently managed SNAT rules (for testing).
69102func (m * FakeManager ) GetManaged () map [string ]SNATRule {
70103 m .mu .Lock ()
71104 defer m .mu .Unlock ()
@@ -76,3 +109,15 @@ func (m *FakeManager) GetManaged() map[string]SNATRule {
76109 }
77110 return result
78111}
112+
113+ // GetManagedForward returns a copy of the currently managed FORWARD rules (for testing).
114+ func (m * FakeManager ) GetManagedForward () map [string ]ForwardRule {
115+ m .mu .Lock ()
116+ defer m .mu .Unlock ()
117+
118+ result := make (map [string ]ForwardRule , len (m .managedForward ))
119+ for k , v := range m .managedForward {
120+ result [k ] = v
121+ }
122+ return result
123+ }
0 commit comments