From 7fe4ac72fe45f535136081347580406dd8c755d8 Mon Sep 17 00:00:00 2001 From: Jian Qiu Date: Wed, 8 Oct 2025 13:18:34 +0800 Subject: [PATCH] fix: network manager keyfile static routes (#23480) Co-authored-by: Qiu Jian --- pkg/hostman/guestfs/fsdriver/linux.go | 12 ++++--- .../guestfs/fsdriver/networkmaanger.go | 32 +++++++++++++++---- .../guestfs/fsdriver/networkmanager_test.go | 4 ++- 3 files changed, 36 insertions(+), 12 deletions(-) diff --git a/pkg/hostman/guestfs/fsdriver/linux.go b/pkg/hostman/guestfs/fsdriver/linux.go index 67fe971e2f..6ee3a8eb2c 100644 --- a/pkg/hostman/guestfs/fsdriver/linux.go +++ b/pkg/hostman/guestfs/fsdriver/linux.go @@ -1460,17 +1460,21 @@ func (r *sRedhatLikeRootFs) deployNetworkManagerConfigurations(rootFs IDiskParti return errors.Wrap(err, "enableBondingModule") } } - // nicCnt := len(allNics) - len(bondNics) + nicCnt := len(allNics) - len(bondNics) mainNic := getMainNic(allNics) - var mainIp, mainIp6 string + var mainIp string if mainNic != nil { mainIp = mainNic.Ip - mainIp6 = mainNic.Ip6 + } + mainNic6 := getMainNic6(allNics) + var mainIp6 string + if mainNic6 != nil { + mainIp6 = mainNic6.Ip6 } for i := range allNics { nicDesc := allNics[i] - profile := nicDescToNetworkManager(nicDesc, mainIp, mainIp6) + profile := nicDescToNetworkManager(nicDesc, mainIp, mainIp6, nicCnt) var fn = fmt.Sprintf("%s/%s.nmconnection", scriptPath, nicDesc.Name) if err := rootFs.FilePutContents(fn, profile, false, false); err != nil { return err diff --git a/pkg/hostman/guestfs/fsdriver/networkmaanger.go b/pkg/hostman/guestfs/fsdriver/networkmaanger.go index 7283fa2534..19bf98b8f3 100644 --- a/pkg/hostman/guestfs/fsdriver/networkmaanger.go +++ b/pkg/hostman/guestfs/fsdriver/networkmaanger.go @@ -24,7 +24,7 @@ import ( "yunion.io/x/onecloud/pkg/util/stringutils2" ) -func nicDescToNetworkManager(nicDesc *types.SServerNic, mainIp string, mainIp6 string) string { +func nicDescToNetworkManager(nicDesc *types.SServerNic, mainIp string, mainIp6 string, nicCnt int) string { var profile strings.Builder profile.WriteString("[connection]\n") @@ -57,12 +57,6 @@ func nicDescToNetworkManager(nicDesc *types.SServerNic, mainIp string, mainIp6 s if len(nicDesc.Mac) > 0 && nicDesc.NicType != api.NIC_TYPE_INFINIBAND { profile.WriteString("[ethernet]\n") - if len(nicDesc.TeamingSlaves) == 0 { - // only real physical nic can set HWADDR - // cmds.WriteString("HWADDR=") - // cmds.WriteString(nicDesc.Mac) - // cmds.WriteString("\n") - } profile.WriteString(fmt.Sprintf("mac-address=%s\n", nicDesc.Mac)) if nicDesc.Mtu > 0 { profile.WriteString(fmt.Sprintf("mtu=%d\n", nicDesc.Mtu)) @@ -83,6 +77,10 @@ func nicDescToNetworkManager(nicDesc *types.SServerNic, mainIp string, mainIp6 s profile.WriteString(fmt.Sprintf("address1=%s/32\n", netutils2.PSEUDO_VIP)) profile.WriteString("\n") } else if nicDesc.Manual { + routes4 := make([]netutils2.SRouteInfo, 0) + routes6 := make([]netutils2.SRouteInfo, 0) + routes4, routes6 = netutils2.AddNicRoutes(routes4, routes6, nicDesc, mainIp, mainIp6, nicCnt) + // manual interface if len(nicDesc.Ip) > 0 { profile.WriteString("[ipv4]\n") @@ -91,10 +89,20 @@ func nicDescToNetworkManager(nicDesc *types.SServerNic, mainIp string, mainIp6 s if len(nicDesc.Gateway) > 0 && nicDesc.Ip == mainIp { profile.WriteString(fmt.Sprintf("gateway=%s\n", nicDesc.Gateway)) } + // dns dnslist, _ := netutils2.GetNicDns(nicDesc) if len(dnslist) > 0 { profile.WriteString(fmt.Sprintf("dns=%s\n", strings.Join(dnslist, ","))) } + // static routes + for i := range routes4 { + gwstr := routes4[i].Gateway.String() + if gwstr == "0.0.0.0" { + profile.WriteString(fmt.Sprintf("route%d=%s\n", i+1, routes4[i].SPrefixInfo.String())) + } else { + profile.WriteString(fmt.Sprintf("route%d=%s,%s\n", i+1, routes4[i].SPrefixInfo.String(), gwstr)) + } + } profile.WriteString("\n") } if len(nicDesc.Ip6) > 0 { @@ -104,10 +112,20 @@ func nicDescToNetworkManager(nicDesc *types.SServerNic, mainIp string, mainIp6 s if len(nicDesc.Gateway6) > 0 && nicDesc.Ip6 == mainIp6 { profile.WriteString(fmt.Sprintf("gateway=%s\n", nicDesc.Gateway6)) } + // dns _, dns6list := netutils2.GetNicDns(nicDesc) if len(dns6list) > 0 { profile.WriteString(fmt.Sprintf("dns=%s\n", strings.Join(dns6list, ","))) } + // static routes + for i := range routes6 { + gwstr := routes6[i].Gateway.String() + if gwstr == "::" { + profile.WriteString(fmt.Sprintf("route%d=%s\n", i+1, routes6[i].SPrefixInfo.String())) + } else { + profile.WriteString(fmt.Sprintf("route%d=%s,%s\n", i+1, routes6[i].SPrefixInfo.String(), gwstr)) + } + } profile.WriteString("\n") } } else { diff --git a/pkg/hostman/guestfs/fsdriver/networkmanager_test.go b/pkg/hostman/guestfs/fsdriver/networkmanager_test.go index da132f643a..6ff44ddea6 100644 --- a/pkg/hostman/guestfs/fsdriver/networkmanager_test.go +++ b/pkg/hostman/guestfs/fsdriver/networkmanager_test.go @@ -89,11 +89,13 @@ mac-address=00:22:0a:0b:0c:0d method=manual address1=192.168.1.100/24 gateway=192.168.1.1 +route1=169.254.169.254/32 [ipv6] method=manual address1=2001:db8::200/64 gateway=2001:db8::1 +route1=fd00:ec2::254/128 `, }, @@ -220,7 +222,7 @@ method=disabled } for _, c := range cases { - got := nicDescToNetworkManager(c.nicDesc, c.mainIp, c.mainIp6) + got := nicDescToNetworkManager(c.nicDesc, c.mainIp, c.mainIp6, 1) if got != c.want { t.Errorf("[[got]]\n%s\n[[want]]\n%s\n[[end]]", got, c.want) }