Revert "feat: add support for BGP unnumbered peers (#1506)"

This reverts commit 7d33c747ff.

Signed-off-by: Marcel Fest <marcel.fest@telekom.de>
This commit is contained in:
Marcel Fest
2026-04-08 18:18:01 +02:00
committed by Marcel Fest
parent 7d33c747ff
commit 5a61cf0ede
4 changed files with 19 additions and 97 deletions

View File

@@ -13,7 +13,6 @@ import (
api "github.com/osrg/gobgp/v3/api" api "github.com/osrg/gobgp/v3/api"
"github.com/kube-vip/kube-vip/pkg/utils" "github.com/kube-vip/kube-vip/pkg/utils"
"github.com/osrg/gobgp/v3/pkg/config/oc"
"github.com/osrg/gobgp/v3/pkg/server" "github.com/osrg/gobgp/v3/pkg/server"
"google.golang.org/protobuf/types/known/anypb" "google.golang.org/protobuf/types/known/anypb"
) )
@@ -22,10 +21,9 @@ import (
func (b *Server) AddPeer(ctx context.Context, peer kubevip.BGPPeer) (err error) { func (b *Server) AddPeer(ctx context.Context, peer kubevip.BGPPeer) (err error) {
p := &api.Peer{ p := &api.Peer{
Conf: &api.PeerConf{ Conf: &api.PeerConf{
NeighborAddress: peer.Address, NeighborAddress: peer.Address,
PeerAsn: peer.AS, PeerAsn: peer.AS,
NeighborInterface: peer.Interface, AuthPassword: peer.Password,
AuthPassword: peer.Password,
}, },
Timers: &api.Timers{ Timers: &api.Timers{
@@ -49,17 +47,6 @@ func (b *Server) AddPeer(ctx context.Context, peer kubevip.BGPPeer) (err error)
}, },
} }
if peer.Interface != "" {
neighborAddress, err := oc.GetIPv6LinkLocalNeighborAddress(peer.Interface)
if err != nil {
return fmt.Errorf("failed to get link-local address of interface %s: %w", peer.Interface, err)
}
p.State = &api.PeerState{
NeighborAddress: neighborAddress,
}
}
if b.c.MpbgpNexthop != "" { if b.c.MpbgpNexthop != "" {
p.AfiSafis = []*api.AfiSafi{ p.AfiSafis = []*api.AfiSafi{
{ {

View File

@@ -1,8 +1,10 @@
package kubevip package bgp
import ( import (
"reflect" "reflect"
"testing" "testing"
"github.com/kube-vip/kube-vip/pkg/kubevip"
) )
func TestParseBGPPeerConfig(t *testing.T) { func TestParseBGPPeerConfig(t *testing.T) {
@@ -12,13 +14,13 @@ func TestParseBGPPeerConfig(t *testing.T) {
tests := []struct { tests := []struct {
name string name string
args args args args
wantBgpPeers []BGPPeer wantBgpPeers []kubevip.BGPPeer
wantErr bool wantErr bool
}{ }{
{ {
name: "IPv4, default port", name: "IPv4, default port",
args: args{config: "192.168.0.10:65000::false,192.168.0.11:65000::false"}, args: args{config: "192.168.0.10:65000::false,192.168.0.11:65000::false"},
wantBgpPeers: []BGPPeer{ wantBgpPeers: []kubevip.BGPPeer{
{Address: "192.168.0.10", Port: 179, AS: 65000, MultiHop: false}, {Address: "192.168.0.10", Port: 179, AS: 65000, MultiHop: false},
{Address: "192.168.0.11", Port: 179, AS: 65000, MultiHop: false}, {Address: "192.168.0.11", Port: 179, AS: 65000, MultiHop: false},
}, },
@@ -26,7 +28,7 @@ func TestParseBGPPeerConfig(t *testing.T) {
{ {
name: "IPv4, different port", name: "IPv4, different port",
args: args{config: "192.168.0.10:65000::false:180,192.168.0.11:65000::false:190"}, args: args{config: "192.168.0.10:65000::false:180,192.168.0.11:65000::false:190"},
wantBgpPeers: []BGPPeer{ wantBgpPeers: []kubevip.BGPPeer{
{Address: "192.168.0.10", Port: 180, AS: 65000, MultiHop: false}, {Address: "192.168.0.10", Port: 180, AS: 65000, MultiHop: false},
{Address: "192.168.0.11", Port: 190, AS: 65000, MultiHop: false}, {Address: "192.168.0.11", Port: 190, AS: 65000, MultiHop: false},
}, },
@@ -34,22 +36,14 @@ func TestParseBGPPeerConfig(t *testing.T) {
{ {
name: "IPv6, multi-protocol", name: "IPv6, multi-protocol",
args: args{config: "[fd00:1111:2222:3333:c7d9:7235:6bf7:5d52]:65501::false/mpbgp_nexthop=auto_sourceif"}, args: args{config: "[fd00:1111:2222:3333:c7d9:7235:6bf7:5d52]:65501::false/mpbgp_nexthop=auto_sourceif"},
wantBgpPeers: []BGPPeer{ wantBgpPeers: []kubevip.BGPPeer{
{Address: "fd00:1111:2222:3333:c7d9:7235:6bf7:5d52", Port: 179, AS: 65501, MultiHop: false, MpbgpNexthop: "auto_sourceif"}, {Address: "fd00:1111:2222:3333:c7d9:7235:6bf7:5d52", Port: 179, AS: 65501, MultiHop: false, MpbgpNexthop: "auto_sourceif"},
}, },
}, },
{
name: "Unnumbered",
args: args{config: "unnumbered:eth0,unnumbered:eth1:65000::true/mpbgp_nexthop=auto_sourceif"},
wantBgpPeers: []BGPPeer{
{Interface: "eth0", MultiHop: false},
{Interface: "eth1", AS: 65000, MultiHop: true, MpbgpNexthop: "auto_sourceif"},
},
},
} }
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
gotBgpPeers, err := ParseBGPPeerConfig(tt.args.config) gotBgpPeers, err := kubevip.ParseBGPPeerConfig(tt.args.config)
if (err != nil) != tt.wantErr { if (err != nil) != tt.wantErr {
t.Errorf("ParseBGPPeerConfig() error = %v, wantErr %v", err, tt.wantErr) t.Errorf("ParseBGPPeerConfig() error = %v, wantErr %v", err, tt.wantErr)
return return

View File

@@ -16,7 +16,6 @@ import (
type BGPPeer struct { type BGPPeer struct {
Address string Address string
Port uint16 Port uint16
Interface string
AS uint32 AS uint32
Password string Password string
MultiHop bool MultiHop bool
@@ -66,7 +65,6 @@ func ParseBGPPeerConfig(config string) (bgpPeers []BGPPeer, err error) {
continue continue
} }
isV6Peer := peerStr[0] == '[' isV6Peer := peerStr[0] == '['
isUnnumberedPeer := strings.HasPrefix(peerStr, "unnumbered:")
address := "" address := ""
if isV6Peer { if isV6Peer {
@@ -76,29 +74,20 @@ func ParseBGPPeerConfig(config string) (bgpPeers []BGPPeer, err error) {
} }
address = peerStr[1:addressEndPos] address = peerStr[1:addressEndPos]
peerStr = peerStr[addressEndPos+1:] peerStr = peerStr[addressEndPos+1:]
} else if isUnnumberedPeer {
unnumberedEndPos := strings.IndexByte(peerStr, ':')
peerStr = peerStr[unnumberedEndPos+1:]
} }
peer := strings.Split(peerStr, ":") peer := strings.Split(peerStr, ":")
if len(peer) < 2 && !isUnnumberedPeer { if len(peer) < 2 {
return nil, fmt.Errorf("mandatory peering params <host>:<AS> incomplete") return nil, fmt.Errorf("mandatory peering params <host>:<AS> incomplete")
} }
iface := "" if !isV6Peer {
if isUnnumberedPeer {
iface = peer[0]
} else if !isV6Peer {
address = peer[0] address = peer[0]
} }
var ASNumber uint64 ASNumber, err := strconv.ParseUint(peer[1], 10, 32)
if len(peer) >= 2 { if err != nil {
ASNumber, err = strconv.ParseUint(peer[1], 10, 32) return nil, fmt.Errorf("BGP Peer AS format error [%s]", peer[1])
if err != nil {
return nil, fmt.Errorf("BGP Peer AS format error [%s]", peer[1])
}
} }
password := "" password := ""
@@ -118,9 +107,9 @@ func ParseBGPPeerConfig(config string) (bgpPeers []BGPPeer, err error) {
if len(peer) >= 5 { if len(peer) >= 5 {
port, err = strconv.ParseUint(peer[4], 10, 16) port, err = strconv.ParseUint(peer[4], 10, 16)
if err != nil { if err != nil {
return nil, fmt.Errorf("BGP Peer Port format error [%s]", peer[4]) return nil, fmt.Errorf("BGP Peer AS format error [%s]", peer[1])
} }
} else if !isUnnumberedPeer { } else {
port = 179 port = 179
} }
@@ -144,11 +133,9 @@ func ParseBGPPeerConfig(config string) (bgpPeers []BGPPeer, err error) {
} }
peerConfig := BGPPeer{ peerConfig := BGPPeer{
Address: address, Address: address,
//nolint:gosec // previously parsed into uint32
AS: uint32(ASNumber), AS: uint32(ASNumber),
Port: uint16(port), Port: uint16(port),
Interface: iface,
Password: password, Password: password,
MultiHop: multiHop, MultiHop: multiHop,
MpbgpNexthop: mpbgpNexthop, MpbgpNexthop: mpbgpNexthop,

View File

@@ -229,51 +229,5 @@ var _ = Describe("kube-vip BGP when deployed as a regular pod", Ordered, func()
}) })
}) })
Describe("kube-vip IPv6 BGP unnumbered functionality", Ordered, func() {
var (
client kubernetes.Interface
clusterName string
tempDirPath string
)
BeforeAll(func() {
networking := &kindconfigv1alpha4.Networking{
IPFamily: kindconfigv1alpha4.IPv6Family,
}
var err error
tempDirPath, err = os.MkdirTemp(tempDirPathRoot, "kube-vip-test-bgp-v6")
Expect(err).NotTo(HaveOccurred())
clusterName, client, _ = prepareClusterForDS(tempDirPath, "bgp-ds-v6", imagePath, k8sImagePath,
logger, networking, 1, nil)
})
AfterAll(func() {
Eventually(func() error {
return e2e.GetLogs(ctx, client, tempDirPath)
}, "60s", "5s").Should(Succeed())
cleanupCluster(clusterName, ConfigMtx, logger)
})
It(clusterName+" exits gracefully when unnumbered BGP peers are configured", func() {
manifestValues := &e2e.KubevipManifestValues{
Mode: Mode,
ControlPlaneEnable: "true",
VipElectionEnable: "false",
ImagePath: imagePath,
ConfigPath: configPath,
SvcEnable: "true",
SvcElectionEnable: "false",
EnableEndpointslices: "true",
EnableNodeLabeling: "false",
BGPPeers: "unnumbered:eth0",
BGPAS: 2,
}
testDS(ctx, manifestValues, client, utils.IPv6Family, clusterName)
})
})
} }
}) })