1
1
package daemon
2
2
3
3
import (
4
+ "strings"
4
5
"sync"
5
6
6
7
"github.com/kubeovn/gonetworkmanager/v2"
@@ -11,12 +12,11 @@ import (
11
12
)
12
13
13
14
type networkManagerSyncer struct {
14
- manager gonetworkmanager.NetworkManager
15
- workqueue workqueue.Interface
16
- devicePaths * strset.Set
17
- pathMap map [string ]string
18
- bridgeMap map [string ]string
19
- lock sync.Mutex
15
+ manager gonetworkmanager.NetworkManager
16
+ workqueue workqueue.Interface
17
+ devices * strset.Set
18
+ bridgeMap map [string ]string
19
+ lock sync.Mutex
20
20
}
21
21
22
22
func newNetworkManagerSyncer () * networkManagerSyncer {
@@ -40,8 +40,7 @@ func newNetworkManagerSyncer() *networkManagerSyncer {
40
40
41
41
syncer .manager = manager
42
42
syncer .workqueue = workqueue .NewNamed ("NetworkManagerSyncer" )
43
- syncer .devicePaths = strset .New ()
44
- syncer .pathMap = make (map [string ]string )
43
+ syncer .devices = strset .New ()
45
44
syncer .bridgeMap = make (map [string ]string )
46
45
return syncer
47
46
}
@@ -60,17 +59,12 @@ func (n *networkManagerSyncer) Run(handler func(nic, bridge string, delNonExiste
60
59
ch := n .manager .Subscribe ()
61
60
defer n .manager .Unsubscribe ()
62
61
63
- stateChange := gonetworkmanager . DeviceInterface + "." + gonetworkmanager .ActiveConnectionSignalStateChanged
62
+ suffix := "." + gonetworkmanager .ActiveConnectionSignalStateChanged
64
63
for {
65
64
event := <- ch
66
-
67
- n .lock .Lock ()
68
- if len (event .Body ) == 0 || event .Name != stateChange || ! n .devicePaths .Has (string (event .Path )) {
69
- n .lock .Unlock ()
65
+ if len (event .Body ) == 0 || ! strings .HasSuffix (event .Name , suffix ) {
70
66
continue
71
67
}
72
- n .lock .Unlock ()
73
-
74
68
state , ok := event .Body [0 ].(uint32 )
75
69
if ! ok {
76
70
klog .Warningf ("failed to convert %#v to uint32" , event .Body [0 ])
@@ -80,8 +74,39 @@ func (n *networkManagerSyncer) Run(handler func(nic, bridge string, delNonExiste
80
74
continue
81
75
}
82
76
83
- klog .Infof ("adding dbus object path %s to workqueue" , event .Path )
84
- n .workqueue .Add (string (event .Path ))
77
+ devices , err := n .manager .GetDevices ()
78
+ if err != nil {
79
+ klog .Errorf ("failed to get NetworkManager devices: %v" , err )
80
+ continue
81
+ }
82
+
83
+ var device gonetworkmanager.Device
84
+ for _ , dev := range devices {
85
+ if dev .GetPath () == event .Path {
86
+ device = dev
87
+ break
88
+ }
89
+ }
90
+ if device == nil {
91
+ klog .Warningf ("NetworkManager device %s not found" , event .Path )
92
+ continue
93
+ }
94
+
95
+ name , err := device .GetPropertyIpInterface ()
96
+ if err != nil {
97
+ klog .Errorf ("failed to get IP interface of device %s: %v" , device .GetPath (), err )
98
+ continue
99
+ }
100
+
101
+ n .lock .Lock ()
102
+ if ! n .devices .Has (name ) {
103
+ n .lock .Unlock ()
104
+ continue
105
+ }
106
+ n .lock .Unlock ()
107
+
108
+ klog .Infof ("adding device %s to workqueue" , name )
109
+ n .workqueue .Add (name )
85
110
}
86
111
}()
87
112
}
@@ -93,23 +118,18 @@ func (n *networkManagerSyncer) ProcessNextItem(handler func(nic, bridge string,
93
118
}
94
119
defer n .workqueue .Done (item )
95
120
96
- klog .Infof ("process dbus object path %v" , item )
97
- path := item .(string )
121
+ klog .Infof ("process device %v" , item )
122
+
123
+ nic := item .(string )
124
+ var bridge string
98
125
n .lock .Lock ()
99
- if ! n .devicePaths .Has (path ) {
126
+ if ! n .devices .Has (nic ) {
100
127
n .lock .Unlock ()
101
128
return true
102
129
}
103
- var nic string
104
- for k , v := range n .pathMap {
105
- if v == path {
106
- nic = k
107
- break
108
- }
109
- }
130
+ bridge = n .bridgeMap [nic ]
110
131
n .lock .Unlock ()
111
132
112
- bridge := n .bridgeMap [nic ]
113
133
if _ , err := handler (nic , bridge , true ); err != nil {
114
134
klog .Errorf ("failed to handle NetworkManager event for device %s with bridge %s: %v" , nic , bridge , err )
115
135
}
@@ -123,23 +143,10 @@ func (n *networkManagerSyncer) AddDevice(nicName, bridge string) error {
123
143
}
124
144
125
145
n .lock .Lock ()
126
- defer n .lock .Unlock ()
127
-
128
- if _ , ok := n .pathMap [nicName ]; ok {
129
- return nil
130
- }
131
-
132
- device , err := n .manager .GetDeviceByIpIface (nicName )
133
- if err != nil {
134
- klog .Errorf ("failed to get device by IP iface %q: %v" , nicName , err )
135
- return err
136
- }
137
-
138
- path := string (device .GetPath ())
139
- klog .V (3 ).Infof ("adding device %s with dbus object path %s and bridge %s" , nicName , path , bridge )
140
- n .devicePaths .Add (path )
141
- n .pathMap [nicName ] = path
146
+ klog .V (3 ).Infof ("adding device %s with bridge %s" , nicName , bridge )
147
+ n .devices .Add (nicName )
142
148
n .bridgeMap [nicName ] = bridge
149
+ n .lock .Unlock ()
143
150
144
151
return nil
145
152
}
@@ -150,8 +157,7 @@ func (n *networkManagerSyncer) RemoveDevice(nicName string) error {
150
157
}
151
158
152
159
n .lock .Lock ()
153
- n .devicePaths .Remove (n .pathMap [nicName ])
154
- delete (n .pathMap , nicName )
160
+ n .devices .Remove (nicName )
155
161
delete (n .bridgeMap , nicName )
156
162
n .lock .Unlock ()
157
163
0 commit comments