Skip to content

Commit 74c652e

Browse files
committed
underlay: does not set a device managed to no if it has VLAN managed by NM (#2986)
1 parent 48187e4 commit 74c652e

File tree

1 file changed

+63
-0
lines changed

1 file changed

+63
-0
lines changed

pkg/daemon/nm_linux.go

+63
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55

66
"github.com/kubeovn/gonetworkmanager/v2"
77
"github.com/scylladb/go-set/strset"
8+
"github.com/vishvananda/netlink"
89
"k8s.io/client-go/util/workqueue"
910
"k8s.io/klog/v2"
1011
)
@@ -162,6 +163,12 @@ func (n *networkManagerSyncer) SetManaged(name string, managed bool) error {
162163
return nil
163164
}
164165

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+
165172
device, err := n.manager.GetDeviceByIpIface(name)
166173
if err != nil {
167174
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 {
176183
return nil
177184
}
178185

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+
179242
klog.Infof(`setting device %s NetworkManager property "managed" to %v`, name, managed)
180243
if err = device.SetPropertyManaged(managed); err != nil {
181244
klog.Errorf("failed to set device property managed to %v: %v", managed, err)

0 commit comments

Comments
 (0)