5
5
6
6
"github.com/kubeovn/gonetworkmanager/v2"
7
7
"github.com/scylladb/go-set/strset"
8
+ "github.com/vishvananda/netlink"
8
9
"k8s.io/client-go/util/workqueue"
9
10
"k8s.io/klog/v2"
10
11
)
@@ -162,6 +163,12 @@ func (n *networkManagerSyncer) SetManaged(name string, managed bool) error {
162
163
return nil
163
164
}
164
165
166
+ link , err := netlink .LinkByName (name )
167
+ if err != nil {
168
+ klog .Errorf ("failed to get link %q: %v" , name , err )
169
+ return err
170
+ }
171
+
165
172
device , err := n .manager .GetDeviceByIpIface (name )
166
173
if err != nil {
167
174
klog .Errorf ("failed to get device by IP iface %q: %v" , name , err )
@@ -176,6 +183,62 @@ func (n *networkManagerSyncer) SetManaged(name string, managed bool) error {
176
183
return nil
177
184
}
178
185
186
+ if ! managed {
187
+ devices , err := n .manager .GetAllDevices ()
188
+ if err != nil {
189
+ klog .Errorf ("failed to get all devices from NetworkManager: %v" , err )
190
+ return err
191
+ }
192
+
193
+ var hasVlan bool
194
+ for _ , dev := range devices {
195
+ managed , err := device .GetPropertyManaged ()
196
+ if err != nil {
197
+ klog .Errorf ("failed to get property managed of device %s: %v" , dev .GetPath (), err )
198
+ continue
199
+ }
200
+ if ! managed {
201
+ continue
202
+ }
203
+
204
+ devType , err := dev .GetPropertyDeviceType ()
205
+ if err != nil {
206
+ klog .Errorf ("failed to get type of device %s: %v" , dev .GetPath (), err )
207
+ continue
208
+ }
209
+ if devType != gonetworkmanager .NmDeviceTypeVlan {
210
+ continue
211
+ }
212
+
213
+ vlanName , err := dev .GetPropertyIpInterface ()
214
+ if err != nil {
215
+ klog .Errorf ("failed to get IP interface of device %s: %v" , dev .GetPath (), err )
216
+ continue
217
+ }
218
+
219
+ vlanLink , err := netlink .LinkByName (vlanName )
220
+ if err != nil {
221
+ klog .Errorf ("failed to get link %s: %v" , vlanName , err )
222
+ continue
223
+ }
224
+ if vlanLink .Type () != "vlan" {
225
+ klog .Errorf ("unexpected link type: %s" , vlanLink .Type ())
226
+ continue
227
+ }
228
+
229
+ if vlanLink .Attrs ().ParentIndex == link .Attrs ().Index {
230
+ klog .Infof ("device %s has a vlan interface %s managed by NetworkManager" , name , vlanName )
231
+ hasVlan = true
232
+ break
233
+ }
234
+ }
235
+
236
+ if hasVlan {
237
+ klog .Infof (`will not set device %s NetworkManager property "managed" to %v` , name , managed )
238
+ return nil
239
+ }
240
+ }
241
+
179
242
klog .Infof (`setting device %s NetworkManager property "managed" to %v` , name , managed )
180
243
if err = device .SetPropertyManaged (managed ); err != nil {
181
244
klog .Errorf ("failed to set device property managed to %v: %v" , managed , err )
0 commit comments