Skip to content

Commit 5d9663c

Browse files
authored
Only add no bgp enforce-first-as on frr >= 10 (#194)
1 parent f5cab7e commit 5d9663c

File tree

6 files changed

+70
-9
lines changed

6 files changed

+70
-9
lines changed

controllers/firewall_controller.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"strings"
1010
"time"
1111

12+
"github.com/Masterminds/semver/v3"
1213
"github.com/go-logr/logr"
1314
mn "github.com/metal-stack/metal-lib/pkg/net"
1415
corev1 "k8s.io/api/core/v1"
@@ -49,6 +50,8 @@ type FirewallReconciler struct {
4950
recordFirewallEvent func(f *firewallv2.Firewall, eventtype, reason, message string)
5051

5152
SeedUpdatedFunc func()
53+
54+
FrrVersion *semver.Version
5255
}
5356

5457
const (
@@ -115,7 +118,7 @@ func (r *FirewallReconciler) Reconcile(ctx context.Context, req ctrl.Request) (c
115118
r.Log.Info("reconciling network settings")
116119

117120
var errs []error
118-
changed, err := network.ReconcileNetwork(f)
121+
changed, err := network.ReconcileNetwork(f, r.FrrVersion)
119122
if changed && err == nil {
120123
r.recordFirewallEvent(f, corev1.EventTypeNormal, "Network settings", "reconciliation succeeded (frr.conf)")
121124
} else if changed && err != nil {

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ go 1.23.0
55
toolchain go1.23.4
66

77
require (
8+
github.com/Masterminds/semver/v3 v3.3.1
89
github.com/coreos/go-systemd/v22 v22.5.0
910
github.com/fatih/color v1.18.0
1011
github.com/go-logr/logr v1.4.2
@@ -14,7 +15,7 @@ require (
1415
github.com/metal-stack/firewall-controller-manager v0.4.3
1516
github.com/metal-stack/metal-go v0.39.4
1617
github.com/metal-stack/metal-lib v0.19.0
17-
github.com/metal-stack/metal-networker v0.46.0
18+
github.com/metal-stack/metal-networker v0.46.1
1819
github.com/metal-stack/v v1.0.3
1920
github.com/miekg/dns v1.1.62
2021
github.com/txn2/txeh v1.5.5
@@ -31,7 +32,6 @@ require (
3132
replace k8s.io/apimachinery => k8s.io/apimachinery v0.29.3
3233

3334
require (
34-
github.com/Masterminds/semver/v3 v3.3.1 // indirect
3535
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
3636
github.com/beorn7/perks v1.0.1 // indirect
3737
github.com/cespare/xxhash/v2 v2.3.0 // indirect

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,8 +117,8 @@ github.com/metal-stack/metal-hammer v0.13.10 h1:p1L2rGeABbjv8jRnua7dYF8nDjLZ+Boh
117117
github.com/metal-stack/metal-hammer v0.13.10/go.mod h1:cOdArIOW1VBICPX3dlpyg1Wf3PsMeGjyw7mJJmCTqeU=
118118
github.com/metal-stack/metal-lib v0.19.0 h1:4yBnp/jPGgX9KeCje3A4MFL2oDjgjOjgsIK391LltRI=
119119
github.com/metal-stack/metal-lib v0.19.0/go.mod h1:fCMaWwVGA/xAoGvBk72/nfzqBkHly0iOzrWpc55Fau4=
120-
github.com/metal-stack/metal-networker v0.46.0 h1:fRC+LHRWvvYK9ernI6Wasr9wPseVS1s9q7PAVV3JZKc=
121-
github.com/metal-stack/metal-networker v0.46.0/go.mod h1:C2bsFq4o6p6GwGS2j14/r+nwKGpGSl3uIISzPrhO8+A=
120+
github.com/metal-stack/metal-networker v0.46.1 h1:X4UKEom7ZU9sY0ndrqWhtfUDR0jShGauCpBXVSzAocY=
121+
github.com/metal-stack/metal-networker v0.46.1/go.mod h1:FyG88QowtyZ7J2bBf36HRZsdm7JK1HCNVNrCMU7THQA=
122122
github.com/metal-stack/v v1.0.3 h1:Sh2oBlnxrCUD+mVpzfC8HiqL045YWkxs0gpTvkjppqs=
123123
github.com/metal-stack/v v1.0.3/go.mod h1:YTahEu7/ishwpYKnp/VaW/7nf8+PInogkfGwLcGPdXg=
124124
github.com/miekg/dns v1.1.62 h1:cN8OuEF1/x5Rq6Np+h1epln8OiyPWV+lROx9LxcGgIQ=

main.go

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import (
2929

3030
firewallv1 "github.com/metal-stack/firewall-controller/v2/api/v1"
3131
"github.com/metal-stack/firewall-controller/v2/controllers"
32+
"github.com/metal-stack/firewall-controller/v2/pkg/frr"
3233
"github.com/metal-stack/firewall-controller/v2/pkg/sysctl"
3334
"github.com/metal-stack/firewall-controller/v2/pkg/updater"
3435
// +kubebuilder:scaffold:imports
@@ -211,8 +212,6 @@ func main() {
211212
panic(err)
212213
}
213214

214-
updater := updater.New(ctrl.Log.WithName("updater"), shootMgr.GetEventRecorderFor("FirewallController"))
215-
216215
fwmReconciler := &controllers.FirewallMonitorReconciler{
217216
ShootClient: shootMgr.GetClient(),
218217
Log: ctrl.Log.WithName("controllers").WithName("FirewallMonitorReconciler"),
@@ -222,6 +221,15 @@ func main() {
222221
Namespace: firewallv2.FirewallShootNamespace,
223222
}
224223

224+
frrVersion, err := frr.DetectVersion()
225+
if err != nil {
226+
l.Error("frr version detection", "error", err)
227+
panic(err)
228+
}
229+
l.Info("detected frr", "version", frrVersion.String())
230+
231+
updater := updater.New(ctrl.Log.WithName("updater"), shootMgr.GetEventRecorderFor("FirewallController"))
232+
225233
// Firewall Reconciler
226234
if err = (&controllers.FirewallReconciler{
227235
SeedClient: seedMgr.GetClient(),
@@ -234,6 +242,7 @@ func main() {
234242
Updater: updater,
235243
SeedUpdatedFunc: fwmReconciler.SeedUpdated,
236244
TokenUpdater: accessTokenUpdater,
245+
FrrVersion: frrVersion,
237246
}).SetupWithManager(seedMgr); err != nil {
238247
l.Error("unable to create firewall controller", "error", err)
239248
panic(err)

pkg/frr/frr.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package frr
2+
3+
import (
4+
"fmt"
5+
"os/exec"
6+
"strings"
7+
8+
"github.com/Masterminds/semver/v3"
9+
)
10+
11+
func DetectVersion() (*semver.Version, error) {
12+
13+
vtysh, err := exec.LookPath("vtysh")
14+
if err != nil {
15+
return nil, fmt.Errorf("unable to detect path to vtysh: %w", err)
16+
}
17+
// $ vtysh -c "show version"|grep FRRouting
18+
// FRRouting 10.2.1 (shoot--pz9cjf--mwen-fel-firewall-dcedd) on Linux(6.6.60-060660-generic).
19+
c := exec.Command(vtysh, "-c", "show version")
20+
out, err := c.CombinedOutput()
21+
if err != nil {
22+
return nil, fmt.Errorf("unable to detect frr version with dpkg: %w", err)
23+
}
24+
25+
var frrVersion string
26+
for _, line := range strings.Split(string(out), "\n") {
27+
if !strings.Contains(line, "FRRouting") {
28+
continue
29+
}
30+
31+
fields := strings.Fields(line)
32+
if len(fields) < 2 {
33+
continue
34+
}
35+
36+
frrVersion = fields[1]
37+
break
38+
}
39+
if frrVersion == "" {
40+
return nil, fmt.Errorf("unable to detect frr version")
41+
}
42+
43+
ver, err := semver.NewVersion(frrVersion)
44+
if err != nil {
45+
return nil, fmt.Errorf("unable to parse frr version to semver: %w", err)
46+
}
47+
return ver, nil
48+
}

pkg/network/network.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"os"
77
"path/filepath"
88

9+
"github.com/Masterminds/semver/v3"
910
firewallv2 "github.com/metal-stack/firewall-controller-manager/api/v2"
1011
"github.com/metal-stack/metal-go/api/models"
1112
"github.com/metal-stack/metal-networker/pkg/netconf"
@@ -55,7 +56,7 @@ func GetNewNetworks(f *firewallv2.Firewall, oldNetworks []*models.V1MachineNetwo
5556

5657
// ReconcileNetwork reconciles the network settings for a firewall
5758
// Changes both the FRR-Configuration and Nftable rules when network prefixes or FRR template changes
58-
func ReconcileNetwork(f *firewallv2.Firewall) (changed bool, err error) {
59+
func ReconcileNetwork(f *firewallv2.Firewall, frrVersion *semver.Version) (changed bool, err error) {
5960
tmpFile, err := tmpFile(frrConfig)
6061
if err != nil {
6162
return false, fmt.Errorf("error during network reconciliation %v: %w", tmpFile, err)
@@ -70,7 +71,7 @@ func ReconcileNetwork(f *firewallv2.Firewall) (changed bool, err error) {
7071
}
7172
c.Networks = GetNewNetworks(f, c.Networks)
7273

73-
a := netconf.NewFrrConfigApplier(netconf.Firewall, *c, tmpFile)
74+
a := netconf.NewFrrConfigApplier(netconf.Firewall, *c, tmpFile, frrVersion)
7475
tpl := netconf.MustParseTpl(netconf.TplFirewallFRR)
7576

7677
changed, err = a.Apply(*tpl, tmpFile, frrConfig, true)

0 commit comments

Comments
 (0)