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"
"github.com/kube-vip/kube-vip/pkg/utils"
"github.com/osrg/gobgp/v3/pkg/config/oc"
"github.com/osrg/gobgp/v3/pkg/server"
"google.golang.org/protobuf/types/known/anypb"
)
@@ -22,10 +21,9 @@ import (
func (b *Server) AddPeer(ctx context.Context, peer kubevip.BGPPeer) (err error) {
p := &api.Peer{
Conf: &api.PeerConf{
NeighborAddress: peer.Address,
PeerAsn: peer.AS,
NeighborInterface: peer.Interface,
AuthPassword: peer.Password,
NeighborAddress: peer.Address,
PeerAsn: peer.AS,
AuthPassword: peer.Password,
},
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 != "" {
p.AfiSafis = []*api.AfiSafi{
{

View File

@@ -1,8 +1,10 @@
package kubevip
package bgp
import (
"reflect"
"testing"
"github.com/kube-vip/kube-vip/pkg/kubevip"
)
func TestParseBGPPeerConfig(t *testing.T) {
@@ -12,13 +14,13 @@ func TestParseBGPPeerConfig(t *testing.T) {
tests := []struct {
name string
args args
wantBgpPeers []BGPPeer
wantBgpPeers []kubevip.BGPPeer
wantErr bool
}{
{
name: "IPv4, default port",
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.11", Port: 179, AS: 65000, MultiHop: false},
},
@@ -26,7 +28,7 @@ func TestParseBGPPeerConfig(t *testing.T) {
{
name: "IPv4, different port",
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.11", Port: 190, AS: 65000, MultiHop: false},
},
@@ -34,22 +36,14 @@ func TestParseBGPPeerConfig(t *testing.T) {
{
name: "IPv6, multi-protocol",
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"},
},
},
{
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 {
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 {
t.Errorf("ParseBGPPeerConfig() error = %v, wantErr %v", err, tt.wantErr)
return

View File

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