mirror of
https://hubproxy.babadafafafafa.cn/https://github.com/kube-vip/kube-vip.git
synced 2026-09-20 08:03:47 +08:00
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:
@@ -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{
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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,
|
||||||
|
|||||||
@@ -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)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user