Set Go toolchain to v1.26.1 and apply modernizations (#138)

This change makes sure that we use the latest Go version when building
and applies some modernization fixes.
This commit is contained in:
Philip Laine
2026-03-12 21:40:36 +01:00
committed by GitHub
parent 0fde3631b2
commit 47b1f55c45
8 changed files with 34 additions and 41 deletions
+1 -1
View File
@@ -137,7 +137,7 @@ func main() {
defaultLabelsMap := make(map[string]string) defaultLabelsMap := make(map[string]string)
if defaultLabels != "" { if defaultLabels != "" {
for _, s := range strings.Split(defaultLabels, ",") { for s := range strings.SplitSeq(defaultLabels, ",") {
kv := strings.Split(s, "=") kv := strings.Split(s, "=")
if len(kv) != 2 { if len(kv) != 2 {
panic(fmt.Errorf("invalid label format: %s", s)) panic(fmt.Errorf("invalid label format: %s", s))
+2
View File
@@ -2,6 +2,8 @@ module github.com/netbirdio/kubernetes-operator
go 1.25.0 go 1.25.0
toolchain go1.26.1
require ( require (
github.com/go-logr/logr v1.4.3 github.com/go-logr/logr v1.4.3
github.com/google/uuid v1.6.0 github.com/google/uuid v1.6.0
+7 -7
View File
@@ -68,9 +68,9 @@ func (r *NBPolicyReconciler) getResources(ctx context.Context, nbPolicy *netbird
// mapResources map each NBResource ports and protocols into one object to generate the policy // mapResources map each NBResource ports and protocols into one object to generate the policy
// returns map[protocol] => ports, destination group IDs // returns map[protocol] => ports, destination group IDs
func (r *NBPolicyReconciler) mapResources(ctx context.Context, nbPolicy *netbirdiov1.NBPolicy, resources []netbirdiov1.NBResource, logger logr.Logger) (map[string][]int32, []string, error) { func (r *NBPolicyReconciler) mapResources(ctx context.Context, nbPolicy *netbirdiov1.NBPolicy, resources []netbirdiov1.NBResource, logger logr.Logger) (map[string][]int32, []string, error) {
portMapping := map[string]map[int32]interface{}{ portMapping := map[string]map[int32]any{
protocolTCP: make(map[int32]interface{}), protocolTCP: make(map[int32]any),
protocolUDP: make(map[int32]interface{}), protocolUDP: make(map[int32]any),
} }
groups, err := r.groupNamesToIDs(ctx, nbPolicy.Spec.DestinationGroups, logger) groups, err := r.groupNamesToIDs(ctx, nbPolicy.Spec.DestinationGroups, logger)
if err != nil { if err != nil {
@@ -85,11 +85,11 @@ func (r *NBPolicyReconciler) mapResources(ctx context.Context, nbPolicy *netbird
} }
resourcePolicies := util.SplitTrim(*resource.Status.PolicyName, ",") resourcePolicies := util.SplitTrim(*resource.Status.PolicyName, ",")
if generatedBy == "" && !util.Contains(resourcePolicies, nbPolicy.Name) { if generatedBy == "" && !slices.Contains(resourcePolicies, nbPolicy.Name) {
continue continue
} }
if generatedBy != "" && !util.Contains(resourcePolicies, strings.ReplaceAll(nbPolicy.Name, "-"+generatedBy, "")) { if generatedBy != "" && !slices.Contains(resourcePolicies, strings.ReplaceAll(nbPolicy.Name, "-"+generatedBy, "")) {
continue continue
} }
// Groups // Groups
@@ -282,7 +282,7 @@ func (r *NBPolicyReconciler) syncPolicy(ctx context.Context, nbPolicy *netbirdio
return requeue, errUnknownProtocol return requeue, errUnknownProtocol
} }
if len(nbPolicy.Spec.Protocols) > 0 && !util.Contains(nbPolicy.Spec.Protocols, protocol) { if len(nbPolicy.Spec.Protocols) > 0 && !slices.Contains(nbPolicy.Spec.Protocols, protocol) {
if policyID != nil { if policyID != nil {
logger.Info("Deleting protocol policy as NBPolicy has restricted protocols", "protocol", protocol) logger.Info("Deleting protocol policy as NBPolicy has restricted protocols", "protocol", protocol)
err := r.netbird.Policies.Delete(ctx, *policyID) err := r.netbird.Policies.Delete(ctx, *policyID)
@@ -363,7 +363,7 @@ func (r *NBPolicyReconciler) handleDelete(ctx context.Context, nbPolicy *netbird
} }
nbPolicy.Status.UDPPolicyID = nil nbPolicy.Status.UDPPolicyID = nil
} }
if util.Contains(nbPolicy.Finalizers, "netbird.io/cleanup") { if slices.Contains(nbPolicy.Finalizers, "netbird.io/cleanup") {
nbPolicy.Finalizers = util.Without(nbPolicy.Finalizers, "netbird.io/cleanup") nbPolicy.Finalizers = util.Without(nbPolicy.Finalizers, "netbird.io/cleanup")
err := r.Client.Update(ctx, nbPolicy) err := r.Client.Update(ctx, nbPolicy)
if err != nil { if err != nil {
+6 -6
View File
@@ -217,7 +217,7 @@ func (r *NBResourceReconciler) handlePolicyAddUpdate(ctx context.Context, req ct
return err return err
} }
if !util.Contains(nbPolicy.Status.ManagedServiceList, req.NamespacedName.String()) { if !slices.Contains(nbPolicy.Status.ManagedServiceList, req.NamespacedName.String()) {
nbPolicy.Status.ManagedServiceList = append(nbPolicy.Status.ManagedServiceList, req.NamespacedName.String()) nbPolicy.Status.ManagedServiceList = append(nbPolicy.Status.ManagedServiceList, req.NamespacedName.String())
updatePolicyStatus = true updatePolicyStatus = true
} }
@@ -293,7 +293,7 @@ func (r *NBResourceReconciler) handlePolicyAddUpdate(ctx context.Context, req ct
func (r *NBResourceReconciler) handlePolicyDelete(ctx context.Context, req ctrl.Request, nbResource *netbirdiov1.NBResource, specPolicies []string, policy string, logger logr.Logger) error { func (r *NBResourceReconciler) handlePolicyDelete(ctx context.Context, req ctrl.Request, nbResource *netbirdiov1.NBResource, specPolicies []string, policy string, logger logr.Logger) error {
var nbPolicy netbirdiov1.NBPolicy var nbPolicy netbirdiov1.NBPolicy
if !util.Contains(specPolicies, policy) { if !slices.Contains(specPolicies, policy) {
kubeName := policy kubeName := policy
if v, ok := nbResource.Status.PolicyNameMapping[policy]; ok { if v, ok := nbResource.Status.PolicyNameMapping[policy]; ok {
kubeName = v kubeName = v
@@ -314,7 +314,7 @@ func (r *NBResourceReconciler) handlePolicyDelete(ctx context.Context, req ctrl.
} }
delete(nbResource.Status.PolicyNameMapping, policy) delete(nbResource.Status.PolicyNameMapping, policy)
} else if util.Contains(nbPolicy.Status.ManagedServiceList, req.NamespacedName.String()) { } else if slices.Contains(nbPolicy.Status.ManagedServiceList, req.NamespacedName.String()) {
nbPolicy.Status.ManagedServiceList = util.Without(nbPolicy.Status.ManagedServiceList, req.NamespacedName.String()) nbPolicy.Status.ManagedServiceList = util.Without(nbPolicy.Status.ManagedServiceList, req.NamespacedName.String())
nbPolicy.Status.LastUpdatedAt = &v1.Time{Time: time.Now()} nbPolicy.Status.LastUpdatedAt = &v1.Time{Time: time.Now()}
err := r.Client.Status().Update(ctx, &nbPolicy) err := r.Client.Status().Update(ctx, &nbPolicy)
@@ -364,7 +364,7 @@ func (r *NBResourceReconciler) handlePolicy(ctx context.Context, req ctrl.Reques
// handleGroupUpdate update network resource groups // handleGroupUpdate update network resource groups
func (r *NBResourceReconciler) handleGroupUpdate(ctx context.Context, nbResource *netbirdiov1.NBResource, groupIDs []string, resource *api.NetworkResource, logger logr.Logger) error { func (r *NBResourceReconciler) handleGroupUpdate(ctx context.Context, nbResource *netbirdiov1.NBResource, groupIDs []string, resource *api.NetworkResource, logger logr.Logger) error {
// Handle possible updated group IDs // Handle possible updated group IDs
groupIDMap := make(map[string]interface{}) groupIDMap := make(map[string]any)
for _, g := range groupIDs { for _, g := range groupIDs {
groupIDMap[g] = nil groupIDMap[g] = nil
} }
@@ -478,7 +478,7 @@ func (r *NBResourceReconciler) handleGroups(ctx context.Context, req ctrl.Reques
if ownerIndex == -1 { if ownerIndex == -1 {
continue continue
} }
if util.Contains(nbResource.Spec.Groups, g.Spec.Name) { if slices.Contains(nbResource.Spec.Groups, g.Spec.Name) {
continue continue
} }
if len(g.OwnerReferences) > 1 { if len(g.OwnerReferences) > 1 {
@@ -603,7 +603,7 @@ func (r *NBResourceReconciler) handleDelete(ctx context.Context, req ctrl.Reques
return err return err
} }
if !errors.IsNotFound(err) && util.Contains(nbPolicy.Status.ManagedServiceList, req.NamespacedName.String()) { if !errors.IsNotFound(err) && slices.Contains(nbPolicy.Status.ManagedServiceList, req.NamespacedName.String()) {
nbPolicy.Status.ManagedServiceList = util.Without(nbPolicy.Status.ManagedServiceList, req.NamespacedName.String()) nbPolicy.Status.ManagedServiceList = util.Without(nbPolicy.Status.ManagedServiceList, req.NamespacedName.String())
nbPolicy.Status.LastUpdatedAt = &v1.Time{Time: time.Now()} nbPolicy.Status.LastUpdatedAt = &v1.Time{Time: time.Now()}
err = r.Client.Status().Update(ctx, &nbPolicy) err = r.Client.Status().Update(ctx, &nbPolicy)
@@ -3,6 +3,8 @@ package controller
import ( import (
"context" "context"
"fmt" "fmt"
"maps"
"slices"
"strings" "strings"
"time" "time"
@@ -123,9 +125,7 @@ func (r *NBRoutingPeerReconciler) handleDeployment(ctx context.Context, req ctrl
} }
labels := r.DefaultLabels labels := r.DefaultLabels
for k, v := range nbrp.Spec.Labels { maps.Copy(labels, nbrp.Spec.Labels)
labels[k] = v
}
podLabels := labels podLabels := labels
podLabels["app.kubernetes.io/name"] = "netbird-router" podLabels["app.kubernetes.io/name"] = "netbird-router"
@@ -617,7 +617,7 @@ func (r *NBRoutingPeerReconciler) handleDelete(ctx context.Context, req ctrl.Req
} }
} }
if nbGroup.Spec.Name != "" && util.Contains(nbGroup.Finalizers, "netbird.io/routing-peer-cleanup") { if nbGroup.Spec.Name != "" && slices.Contains(nbGroup.Finalizers, "netbird.io/routing-peer-cleanup") {
nbGroup.Finalizers = util.Without(nbGroup.Finalizers, "netbird.io/routing-peer-cleanup") nbGroup.Finalizers = util.Without(nbGroup.Finalizers, "netbird.io/routing-peer-cleanup")
logger.Info("Removing netbird.io/routing-peer-cleanup finalizer NBGroup", "namespace", nbGroup.Namespace, "name", nbGroup.Name) logger.Info("Removing netbird.io/routing-peer-cleanup finalizer NBGroup", "namespace", nbGroup.Namespace, "name", nbGroup.Name)
err = r.Client.Update(ctx, &nbGroup) err = r.Client.Update(ctx, &nbGroup)
+11 -10
View File
@@ -3,6 +3,7 @@ package controller
import ( import (
"context" "context"
"fmt" "fmt"
"slices"
"strconv" "strconv"
"strings" "strings"
"time" "time"
@@ -96,7 +97,7 @@ func (r *ServiceReconciler) hideService(ctx context.Context, req ctrl.Request, s
} }
} }
if util.Contains(svc.Finalizers, "netbird.io/cleanup") { if slices.Contains(svc.Finalizers, "netbird.io/cleanup") {
svc.Finalizers = util.Without(svc.Finalizers, "netbird.io/cleanup") svc.Finalizers = util.Without(svc.Finalizers, "netbird.io/cleanup")
err := r.Client.Update(ctx, &svc) err := r.Client.Update(ctx, &svc)
if err != nil { if err != nil {
@@ -115,7 +116,7 @@ func (r *ServiceReconciler) exposeService(ctx context.Context, req ctrl.Request,
routerNamespace = req.Namespace routerNamespace = req.Namespace
} }
if !util.Contains(svc.Finalizers, "netbird.io/cleanup") { if !slices.Contains(svc.Finalizers, "netbird.io/cleanup") {
svc.Finalizers = append(svc.Finalizers, "netbird.io/cleanup") svc.Finalizers = append(svc.Finalizers, "netbird.io/cleanup")
err := r.Client.Update(ctx, &svc) err := r.Client.Update(ctx, &svc)
if err != nil { if err != nil {
@@ -196,7 +197,7 @@ func (r *ServiceReconciler) reconcileNBResource(nbResource *netbirdiov1.NBResour
if v, ok := svc.Annotations[serviceGroupsAnnotation]; ok { if v, ok := svc.Annotations[serviceGroupsAnnotation]; ok {
//nolint:prealloc //nolint:prealloc
groups = nil groups = nil
for _, g := range strings.Split(v, ",") { for g := range strings.SplitSeq(v, ",") {
groups = append(groups, strings.TrimSpace(g)) groups = append(groups, strings.TrimSpace(g))
} }
} }
@@ -237,7 +238,7 @@ func (r *ServiceReconciler) applyPolicy(nbResource *netbirdiov1.NBResource, svc
} }
var filterPorts []int32 var filterPorts []int32
if v, ok := svc.Annotations[servicePortsAnnotation]; ok { if v, ok := svc.Annotations[servicePortsAnnotation]; ok {
for _, v := range strings.Split(v, ",") { for v := range strings.SplitSeq(v, ",") {
port, err := strconv.ParseInt(v, 10, 64) port, err := strconv.ParseInt(v, 10, 64)
if err != nil { if err != nil {
return err return err
@@ -267,23 +268,23 @@ func (r *ServiceReconciler) applyPolicy(nbResource *netbirdiov1.NBResource, svc
for _, p := range svc.Spec.Ports { for _, p := range svc.Spec.Ports {
switch p.Protocol { switch p.Protocol {
case corev1.ProtocolTCP: case corev1.ProtocolTCP:
if (len(filterPorts) > 0 && !util.Contains(filterPorts, p.Port)) || (len(filterProtocols) > 0 && !util.Contains(filterProtocols, "tcp")) { if (len(filterPorts) > 0 && !slices.Contains(filterPorts, p.Port)) || (len(filterProtocols) > 0 && !slices.Contains(filterProtocols, "tcp")) {
if util.Contains(nbResource.Spec.TCPPorts, p.Port) { if slices.Contains(nbResource.Spec.TCPPorts, p.Port) {
nbResource.Spec.TCPPorts = util.Without(nbResource.Spec.TCPPorts, p.Port) nbResource.Spec.TCPPorts = util.Without(nbResource.Spec.TCPPorts, p.Port)
} }
continue continue
} }
if !util.Contains(nbResource.Spec.TCPPorts, p.Port) { if !slices.Contains(nbResource.Spec.TCPPorts, p.Port) {
nbResource.Spec.TCPPorts = append(nbResource.Spec.TCPPorts, p.Port) nbResource.Spec.TCPPorts = append(nbResource.Spec.TCPPorts, p.Port)
} }
case corev1.ProtocolUDP: case corev1.ProtocolUDP:
if (len(filterPorts) > 0 && !util.Contains(filterPorts, p.Port)) || (len(filterProtocols) > 0 && !util.Contains(filterProtocols, "udp")) { if (len(filterPorts) > 0 && !slices.Contains(filterPorts, p.Port)) || (len(filterProtocols) > 0 && !slices.Contains(filterProtocols, "udp")) {
if util.Contains(nbResource.Spec.UDPPorts, p.Port) { if slices.Contains(nbResource.Spec.UDPPorts, p.Port) {
nbResource.Spec.UDPPorts = util.Without(nbResource.Spec.UDPPorts, p.Port) nbResource.Spec.UDPPorts = util.Without(nbResource.Spec.UDPPorts, p.Port)
} }
continue continue
} }
if !util.Contains(nbResource.Spec.UDPPorts, p.Port) { if !slices.Contains(nbResource.Spec.UDPPorts, p.Port) {
nbResource.Spec.UDPPorts = append(nbResource.Spec.UDPPorts, p.Port) nbResource.Spec.UDPPorts = append(nbResource.Spec.UDPPorts, p.Port)
} }
default: default:
+1 -11
View File
@@ -2,16 +2,6 @@ package util
import "strings" import "strings"
// Contains return if y is in slice x
func Contains[T comparable](x []T, y T) bool {
for _, v := range x {
if v == y {
return true
}
}
return false
}
// Without return all of x in same order without y // Without return all of x in same order without y
func Without[T comparable](x []T, y T) []T { func Without[T comparable](x []T, y T) []T {
var ret []T var ret []T
@@ -29,7 +19,7 @@ func Equivalent[T comparable](x, y []T) bool {
return false return false
} }
mp := make(map[T]interface{}) mp := make(map[T]any)
for _, v := range x { for _, v := range x {
mp[v] = nil mp[v] = nil
} }
+2 -2
View File
@@ -153,8 +153,8 @@ func LoadImageToKindClusterWithName(name string) error {
// according to line breakers, and ignores the empty elements in it. // according to line breakers, and ignores the empty elements in it.
func GetNonEmptyLines(output string) []string { func GetNonEmptyLines(output string) []string {
var res []string var res []string
elements := strings.Split(output, "\n") elements := strings.SplitSeq(output, "\n")
for _, element := range elements { for element := range elements {
if element != "" { if element != "" {
res = append(res, element) res = append(res, element)
} }