Skip to content

Commit 1dad23d

Browse files
committed
underlay: fix NetworkManager operation (#3147)
* underlay: fix NetworkManager operation * underlay: clear address lifetime --------- Signed-off-by: 张祖建 <zhangzujian.7@gmail.com>
1 parent 0e4909a commit 1dad23d

File tree

4 files changed

+60
-38
lines changed

4 files changed

+60
-38
lines changed

go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ require (
3535
github.com/spf13/pflag v1.0.5
3636
github.com/stretchr/testify v1.8.4
3737
github.com/vishvananda/netlink v1.2.1-beta.2
38+
golang.org/x/mod v0.12.0
3839
golang.org/x/sys v0.11.0
3940
golang.org/x/time v0.3.0
4041
google.golang.org/grpc v1.57.0
@@ -229,7 +230,6 @@ require (
229230
go.uber.org/multierr v1.9.0 // indirect
230231
go.uber.org/zap v1.24.0 // indirect
231232
golang.org/x/crypto v0.11.0 // indirect
232-
golang.org/x/mod v0.10.0 // indirect
233233
golang.org/x/net v0.12.0 // indirect
234234
golang.org/x/oauth2 v0.8.0 // indirect
235235
golang.org/x/sync v0.3.0 // indirect

go.sum

+2-2
Original file line numberDiff line numberDiff line change
@@ -1330,8 +1330,8 @@ golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI=
13301330
golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
13311331
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
13321332
golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
1333-
golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk=
1334-
golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
1333+
golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc=
1334+
golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
13351335
golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
13361336
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
13371337
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=

pkg/daemon/nm_linux.go

+56-35
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"github.com/kubeovn/gonetworkmanager/v2"
88
"github.com/scylladb/go-set/strset"
99
"github.com/vishvananda/netlink"
10+
"golang.org/x/mod/semver"
1011
"k8s.io/client-go/util/workqueue"
1112
"k8s.io/klog/v2"
1213
)
@@ -190,59 +191,79 @@ func (n *networkManagerSyncer) SetManaged(name string, managed bool) error {
190191
}
191192

192193
if !managed {
193-
devices, err := n.manager.GetAllDevices()
194+
links, err := netlink.LinkList()
194195
if err != nil {
195-
klog.Errorf("failed to get all devices from NetworkManager: %v", err)
196+
klog.Errorf("failed to list network links: %v", err)
196197
return err
197198
}
198199

199-
var hasVlan bool
200-
for _, dev := range devices {
201-
managed, err := device.GetPropertyManaged()
202-
if err != nil {
203-
klog.Errorf("failed to get property managed of device %s: %v", dev.GetPath(), err)
204-
continue
205-
}
206-
if !managed {
207-
continue
208-
}
209-
210-
devType, err := dev.GetPropertyDeviceType()
211-
if err != nil {
212-
klog.Errorf("failed to get type of device %s: %v", dev.GetPath(), err)
213-
continue
214-
}
215-
if devType != gonetworkmanager.NmDeviceTypeVlan {
200+
for _, l := range links {
201+
if l.Attrs().ParentIndex != link.Attrs().Index || l.Type() != "vlan" {
216202
continue
217203
}
218204

219-
vlanName, err := dev.GetPropertyIpInterface()
205+
d, err := n.manager.GetDeviceByIpIface(l.Attrs().Name)
220206
if err != nil {
221-
klog.Errorf("failed to get IP interface of device %s: %v", dev.GetPath(), err)
222-
continue
207+
klog.Errorf("failed to get device by IP iface %q: %v", l.Attrs().Name, err)
208+
return err
223209
}
224-
225-
vlanLink, err := netlink.LinkByName(vlanName)
210+
vlanManaged, err := d.GetPropertyManaged()
226211
if err != nil {
227-
klog.Errorf("failed to get link %s: %v", vlanName, err)
212+
klog.Errorf("failed to get property managed of device %s: %v", l.Attrs().Name, err)
228213
continue
229214
}
230-
if vlanLink.Type() != "vlan" {
231-
klog.Errorf("unexpected link type: %s", vlanLink.Type())
232-
continue
215+
if vlanManaged {
216+
// After setting device managed=no, the vlan interface will be set down by NetworkManager.
217+
klog.Infof(`device %q has a vlan interface %q mannaged by NetworkManager, will not set the NetworkManager property "managed" to %v`, name, l.Attrs().Name, managed)
218+
return nil
233219
}
220+
}
234221

235-
if vlanLink.Attrs().ParentIndex == link.Attrs().Index {
236-
klog.Infof("device %s has a vlan interface %s managed by NetworkManager", name, vlanName)
237-
hasVlan = true
238-
break
239-
}
222+
version, err := n.manager.GetPropertyVersion()
223+
if err != nil {
224+
klog.Errorf("failed to get NetworkManager version: %v", err)
225+
return err
226+
}
227+
228+
if !strings.HasPrefix(version, "v") {
229+
version = "v" + version
240230
}
241231

242-
if hasVlan {
243-
klog.Infof(`will not set device %s NetworkManager property "managed" to %v`, name, managed)
232+
// Retrieving DNS configuration requires NetworkManager >= v1.6.0.
233+
// Do not set device managed=no if the version is < v1.6.0.
234+
if semver.Compare(version, "v1.6.0") < 0 {
235+
klog.Infof("NetworkManager version %s is less than v1.6.0")
244236
return nil
245237
}
238+
239+
// requires NetworkManager >= v1.6
240+
dnsManager, err := gonetworkmanager.NewDnsManager()
241+
if err != nil {
242+
klog.Errorf("failed to initialize NetworkManager DNS manager: %v", err)
243+
return err
244+
}
245+
246+
configurations, err := dnsManager.GetPropertyConfiguration()
247+
if err != nil {
248+
klog.Errorf("failed to get NetworkManager DNS configuration: %v", err)
249+
return err
250+
}
251+
252+
for _, c := range configurations {
253+
if c.Interface == name {
254+
if len(c.Nameservers) != 0 {
255+
// After setting device managed=no on CentOS 7 with NetworkManager v1.18.x,
256+
// the DNS servers in /etc/resolv.conf configured on the device will be removed.
257+
// We don't want to change the host DNS configuration, so skip this operation.
258+
klog.Infof("DNS servers %s are configured on interface %s", strings.Join(c.Nameservers, ","), name)
259+
if semver.MajorMinor(version) == "v1.18" {
260+
klog.Infof("NetworkManager's version is v1.18.x")
261+
return nil
262+
}
263+
}
264+
break
265+
}
266+
}
246267
}
247268

248269
klog.Infof(`setting device %s NetworkManager property "managed" to %v`, name, managed)

pkg/daemon/ovs_linux.go

+1
Original file line numberDiff line numberDiff line change
@@ -955,6 +955,7 @@ func (c *Controller) transferAddrsAndRoutes(nicName, brName string, delNonExiste
955955
klog.Infof("address %q has been removed from link %s", addr.String(), nicName)
956956

957957
addr.Label = ""
958+
addr.PreferedLft, addr.ValidLft = 0, 0
958959
if err = netlink.AddrReplace(bridge, &addr); err != nil {
959960
return 0, fmt.Errorf("failed to replace address %q on OVS bridge %s: %v", addr.String(), brName, err)
960961
}

0 commit comments

Comments
 (0)