Dynamic gobgpd listener config, fix leaked listener (#156)

* bgpserver: listen only on enabled address protocols
* tiny typo fix
* Ensure gobgp server listener gets closed
This commit is contained in:
Bryan Zubrod 2017-09-16 02:11:32 -05:00 committed by GitHub
parent 45b72d4b47
commit d6ea74067e

View File

@ -69,7 +69,7 @@ const (
podSubnetIpSetName = "kube-router-pod-subnets" podSubnetIpSetName = "kube-router-pod-subnets"
) )
// Run runs forever till until we are notified on stop channel // Run runs forever until we are notified on stop channel
func (nrc *NetworkRoutingController) Run(stopCh <-chan struct{}, wg *sync.WaitGroup) { func (nrc *NetworkRoutingController) Run(stopCh <-chan struct{}, wg *sync.WaitGroup) {
cidr, err := utils.GetPodCidrFromCniSpec("/etc/cni/net.d/10-kuberouter.conf") cidr, err := utils.GetPodCidrFromCniSpec("/etc/cni/net.d/10-kuberouter.conf")
if err != nil { if err != nil {
@ -158,6 +158,8 @@ func (nrc *NetworkRoutingController) Run(stopCh <-chan struct{}, wg *sync.WaitGr
} }
} }
defer nrc.bgpServer.Stop()
// loop forever till notified to stop on stopCh // loop forever till notified to stop on stopCh
for { for {
select { select {
@ -883,10 +885,21 @@ func (nrc *NetworkRoutingController) startBgpServer() error {
g := bgpapi.NewGrpcServer(nrc.bgpServer, ":50051") g := bgpapi.NewGrpcServer(nrc.bgpServer, ":50051")
go g.Serve() go g.Serve()
var localAddressList []string
if ipv4IsEnabled() {
localAddressList = append(localAddressList, "0.0.0.0")
}
if ipv6IsEnabled() {
localAddressList = append(localAddressList, "::")
}
global := &config.Global{ global := &config.Global{
Config: config.GlobalConfig{ Config: config.GlobalConfig{
As: nodeAsnNumber, As: nodeAsnNumber,
RouterId: nrc.nodeIP.String(), RouterId: nrc.nodeIP.String(),
LocalAddressList: localAddressList,
}, },
} }
@ -907,6 +920,7 @@ func (nrc *NetworkRoutingController) startBgpServer() error {
}, },
} }
if err := nrc.bgpServer.AddNeighbor(n); err != nil { if err := nrc.bgpServer.AddNeighbor(n); err != nil {
nrc.bgpServer.Stop()
return errors.New("Failed to peer with global peer router \"" + peer + "\" due to: " + err.Error()) return errors.New("Failed to peer with global peer router \"" + peer + "\" due to: " + err.Error())
} }
} }
@ -918,6 +932,7 @@ func (nrc *NetworkRoutingController) startBgpServer() error {
} }
asnNo, err := strconv.ParseUint(nodeBgpPeerAsn, 0, 32) asnNo, err := strconv.ParseUint(nodeBgpPeerAsn, 0, 32)
if err != nil { if err != nil {
nrc.bgpServer.Stop()
return errors.New("Failed to parse ASN number specified for the the node in the annotations") return errors.New("Failed to parse ASN number specified for the the node in the annotations")
} }
peerAsnNo := uint32(asnNo) peerAsnNo := uint32(asnNo)
@ -932,12 +947,14 @@ func (nrc *NetworkRoutingController) startBgpServer() error {
ips := strings.Split(nodeBgpPeersAnnotation, ",") ips := strings.Split(nodeBgpPeersAnnotation, ",")
for _, ip := range ips { for _, ip := range ips {
if net.ParseIP(ip) == nil { if net.ParseIP(ip) == nil {
nrc.bgpServer.Stop()
return errors.New("Invalid node BGP peer router ip in the annotation: " + ip) return errors.New("Invalid node BGP peer router ip in the annotation: " + ip)
} }
} }
nodePeerRouters = append(nodePeerRouters, ips...) nodePeerRouters = append(nodePeerRouters, ips...)
} else { } else {
if net.ParseIP(nodeBgpPeersAnnotation) == nil { if net.ParseIP(nodeBgpPeersAnnotation) == nil {
nrc.bgpServer.Stop()
return errors.New("Invalid node BGP peer router ip: " + nodeBgpPeersAnnotation) return errors.New("Invalid node BGP peer router ip: " + nodeBgpPeersAnnotation)
} }
nodePeerRouters = append(nodePeerRouters, nodeBgpPeersAnnotation) nodePeerRouters = append(nodePeerRouters, nodeBgpPeersAnnotation)
@ -951,6 +968,7 @@ func (nrc *NetworkRoutingController) startBgpServer() error {
}, },
} }
if err := nrc.bgpServer.AddNeighbor(n); err != nil { if err := nrc.bgpServer.AddNeighbor(n); err != nil {
nrc.bgpServer.Stop()
return errors.New("Failed to peer with node specific BGP peer router: " + peer + " due to " + err.Error()) return errors.New("Failed to peer with node specific BGP peer router: " + peer + " due to " + err.Error())
} }
} }
@ -962,6 +980,26 @@ func (nrc *NetworkRoutingController) startBgpServer() error {
return nil return nil
} }
func ipv4IsEnabled() bool {
l, err := net.Listen("tcp4", "")
if err != nil {
return false
}
l.Close()
return true
}
func ipv6IsEnabled() bool {
l, err := net.Listen("tcp6", "")
if err != nil {
return false
}
l.Close()
return true
}
func getNodeSubnet(nodeIp net.IP) (net.IPNet, string, error) { func getNodeSubnet(nodeIp net.IP) (net.IPNet, string, error) {
links, err := netlink.LinkList() links, err := netlink.LinkList()
if err != nil { if err != nil {