Enforce import ordering and aliases (#216)

This change ensures import ordering and aliases is standardized.
Something that is extra important when working with Kuberentes apis that
have "standard" import aliases.

Signed-off-by: Philip Laine <philip.laine@gmail.com>
This commit is contained in:
Philip Laine
2026-04-30 13:39:11 +02:00
committed by GitHub
parent cae1ab796b
commit 74012deb27
35 changed files with 584 additions and 512 deletions
+67 -9
View File
@@ -1,6 +1,4 @@
version: "2"
run:
allow-parallel-runners: true
linters:
default: none
enable:
@@ -21,12 +19,65 @@ linters:
- unconvert
- unparam
- unused
- importas
settings:
revive:
rules:
- name: comment-spacings
staticcheck:
checks: ["all", "-ST1000", "-ST1003", "-ST1016", "-ST1020", "-ST1021", "-ST1022", "-QF1008", "-SA1019"]
importas:
alias:
- pkg: github.com/netbirdio/netbird/shared/management/client/rest
alias: netbird
- pkg: github.com/netbirdio/kubernetes-operator/internal/webhook/v1
alias: nbwebhookv1
- pkg: github.com/netbirdio/kubernetes-operator/api/v1
alias: nbv1
- pkg: github.com/netbirdio/kubernetes-operator/api/v1alpha1
alias: nbv1alpha1
- pkg: github.com/netbirdio/kubernetes-operator/pkg/applyconfigurations/api/v1alpha1
alias: nbv1alpha1ac
- pkg: sigs.k8s.io/controller-runtime
alias: ctrl
- pkg: sigs.k8s.io/controller-runtime/pkg/log
alias: logf
- pkg: k8s.io/apimachinery/pkg/api/errors
alias: kerrors
- pkg: k8s.io/client-go/kubernetes/scheme
alias: clientgoscheme
- pkg: k8s.io/apimachinery/pkg/runtime
alias: apimachineryruntime
- pkg: k8s.io/apimachinery/pkg/util/runtime
alias: utilruntime
- pkg: sigs.k8s.io/controller-runtime/pkg/metrics/server
alias: metricsserver
- pkg: k8s.io/apimachinery/pkg/apis/meta/v1
alias: metav1
- pkg: k8s.io/api/core/v1
alias: corev1
- pkg: k8s.io/api/apps/v1
alias: appsv1
- pkg: k8s.io/api/admission/v1
alias: admissionv1
- pkg: k8s.io/api/policy/v1
alias: policyv1
- pkg: k8s.io/client-go/applyconfigurations/meta/v1
alias: metav1ac
- pkg: k8s.io/client-go/applyconfigurations/core/v1
alias: corev1ac
- pkg: k8s.io/client-go/applyconfigurations/apps/v1
alias: appsv1ac
- pkg: k8s.io/client-go/applyconfigurations/policy/v1
alias: policyv1ac
- pkg: sigs.k8s.io/gateway-api/apis/v1
alias: gwv1
- pkg: sigs.k8s.io/gateway-api/apis/v1alpha2
alias: gwv1alpha2
no-extra-aliases: true
exclusions:
generated: lax
rules:
@@ -43,11 +94,18 @@ linters:
- examples$
formatters:
enable:
- gci
- gofmt
- goimports
exclusions:
generated: lax
paths:
- third_party$
- builtin$
- examples$
settings:
gci:
sections:
- blank
- standard
- prefix(golang.org/x)
- default
- prefix(github.com/netbirdio)
- localmodule
no-inline-comments: true
no-prefix-comments: true
custom-order: true
+2 -1
View File
@@ -1,8 +1,9 @@
package v1
import (
"github.com/netbirdio/kubernetes-operator/internal/util"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/netbirdio/kubernetes-operator/internal/util"
)
// NBGroupSpec defines the desired state of NBGroup.
+2 -1
View File
@@ -1,8 +1,9 @@
package v1
import (
"github.com/netbirdio/kubernetes-operator/internal/util"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/netbirdio/kubernetes-operator/internal/util"
)
// NBPolicySpec defines the desired state of NBPolicy.
+2 -1
View File
@@ -3,8 +3,9 @@ package v1
import (
"maps"
"github.com/netbirdio/kubernetes-operator/internal/util"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/netbirdio/kubernetes-operator/internal/util"
)
// NBResourceSpec defines the desired state of NBResource.
+2 -1
View File
@@ -1,9 +1,10 @@
package v1
import (
"github.com/netbirdio/kubernetes-operator/internal/util"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/netbirdio/kubernetes-operator/internal/util"
)
// NBRoutingPeerSpec defines the desired state of NBRoutingPeer.
+17 -17
View File
@@ -17,6 +17,10 @@ limitations under the License.
package main
import (
// Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.)
// to ensure that exec-entrypoint and run can make use of them.
_ "k8s.io/client-go/plugin/pkg/client/auth"
"crypto/tls"
"errors"
"flag"
@@ -25,11 +29,6 @@ import (
"path/filepath"
"strings"
// Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.)
// to ensure that exec-entrypoint and run can make use of them.
_ "k8s.io/client-go/plugin/pkg/client/auth"
netbird "github.com/netbirdio/netbird/shared/management/client/rest"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/runtime"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
@@ -41,14 +40,15 @@ import (
"sigs.k8s.io/controller-runtime/pkg/log/zap"
metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server"
"sigs.k8s.io/controller-runtime/pkg/webhook"
gatewayv1 "sigs.k8s.io/gateway-api/apis/v1"
gatewayv1alpha2 "sigs.k8s.io/gateway-api/apis/v1alpha2"
gwv1 "sigs.k8s.io/gateway-api/apis/v1"
gwv1alpha2 "sigs.k8s.io/gateway-api/apis/v1alpha2"
netbirdiov1 "github.com/netbirdio/kubernetes-operator/api/v1"
netbirdiov1alpha1 "github.com/netbirdio/kubernetes-operator/api/v1alpha1"
netbird "github.com/netbirdio/netbird/shared/management/client/rest"
nbv1 "github.com/netbirdio/kubernetes-operator/api/v1"
nbv1alpha1 "github.com/netbirdio/kubernetes-operator/api/v1alpha1"
"github.com/netbirdio/kubernetes-operator/internal/controller"
webhooknetbirdiov1 "github.com/netbirdio/kubernetes-operator/internal/webhook/v1"
// +kubebuilder:scaffold:imports
nbwebhookv1 "github.com/netbirdio/kubernetes-operator/internal/webhook/v1"
)
var (
@@ -59,11 +59,11 @@ var (
func init() {
utilruntime.Must(clientgoscheme.AddToScheme(scheme))
utilruntime.Must(netbirdiov1.AddToScheme(scheme))
utilruntime.Must(nbv1.AddToScheme(scheme))
utilruntime.Must(corev1.AddToScheme(scheme))
utilruntime.Must(gatewayv1.Install(scheme))
utilruntime.Must(gatewayv1alpha2.Install(scheme))
utilruntime.Must(netbirdiov1alpha1.AddToScheme(scheme))
utilruntime.Must(gwv1.Install(scheme))
utilruntime.Must(gwv1alpha2.Install(scheme))
utilruntime.Must(nbv1alpha1.AddToScheme(scheme))
// +kubebuilder:scaffold:scheme
}
@@ -215,7 +215,7 @@ func main() {
}
if enableWebhooks {
if err = webhooknetbirdiov1.SetupPodWebhookWithManager(mgr, managementURL, clientImage); err != nil {
if err = nbwebhookv1.SetupPodWebhookWithManager(mgr, managementURL, clientImage); err != nil {
setupLog.Error(err, "unable to create webhook", "webhook", "Pod")
os.Exit(1)
}
@@ -281,7 +281,7 @@ func main() {
}
if enableWebhooks {
if err = webhooknetbirdiov1.SetupNBGroupWebhookWithManager(mgr); err != nil {
if err = nbwebhookv1.SetupNBGroupWebhookWithManager(mgr); err != nil {
setupLog.Error(err, "unable to create webhook", "webhook", "NBGroup")
os.Exit(1)
}
+15 -15
View File
@@ -29,7 +29,7 @@ import (
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
gatewayv1 "sigs.k8s.io/gateway-api/apis/v1"
gwv1 "sigs.k8s.io/gateway-api/apis/v1"
nbv1alpha1 "github.com/netbirdio/kubernetes-operator/api/v1alpha1"
"github.com/netbirdio/kubernetes-operator/internal/gatewayutil"
@@ -41,7 +41,7 @@ type GatewayReconciler struct {
}
func (r *GatewayReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
gw := &gatewayv1.Gateway{}
gw := &gwv1.Gateway{}
err := r.Get(ctx, req.NamespacedName, gw)
if err != nil {
return ctrl.Result{}, client.IgnoreNotFound(err)
@@ -49,7 +49,7 @@ func (r *GatewayReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
sp := patch.NewSerialPatcher(gw, r.Client)
// Check if referenced class belongs to this controller.
gwc := &gatewayv1.GatewayClass{}
gwc := &gwv1.GatewayClass{}
nn := types.NamespacedName{
Name: string(gw.Spec.GatewayClassName),
}
@@ -60,7 +60,7 @@ func (r *GatewayReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
if string(gwc.Spec.ControllerName) != GatewayControllerName {
return ctrl.Result{}, nil
}
if !meta.IsStatusConditionTrue(gwc.Status.Conditions, string(gatewayv1.GatewayClassConditionStatusAccepted)) {
if !meta.IsStatusConditionTrue(gwc.Status.Conditions, string(gwv1.GatewayClassConditionStatusAccepted)) {
return ctrl.Result{RequeueAfter: 5 * time.Second}, nil
}
@@ -73,9 +73,9 @@ func (r *GatewayReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
routingPeerName, err := gatewayutil.GetNetworkRouterName(gw.Spec.Listeners)
if err != nil {
cond := metav1.Condition{
Type: string(gatewayv1.GatewayConditionAccepted),
Type: string(gwv1.GatewayConditionAccepted),
Status: metav1.ConditionFalse,
Reason: string(gatewayv1.GatewayReasonInvalidParameters),
Reason: string(gwv1.GatewayReasonInvalidParameters),
Message: err.Error(),
}
meta.SetStatusCondition(&gw.Status.Conditions, cond)
@@ -86,9 +86,9 @@ func (r *GatewayReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
return ctrl.Result{}, nil
}
cond := metav1.Condition{
Type: string(gatewayv1.GatewayConditionAccepted),
Type: string(gwv1.GatewayConditionAccepted),
Status: metav1.ConditionTrue,
Reason: string(gatewayv1.GatewayReasonAccepted),
Reason: string(gwv1.GatewayReasonAccepted),
}
meta.SetStatusCondition(&gw.Status.Conditions, cond)
controllerutil.AddFinalizer(gw, k8sutil.Finalizer("gateway"))
@@ -105,9 +105,9 @@ func (r *GatewayReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
if !conditions.Has(netRouter, nbv1alpha1.ReadyCondition) {
// TODO (phillebaba): Should watch routing peer instead of retrying when not found.
cond := metav1.Condition{
Type: string(gatewayv1.GatewayConditionProgrammed),
Type: string(gwv1.GatewayConditionProgrammed),
Status: metav1.ConditionFalse,
Reason: string(gatewayv1.GatewayReasonProgrammed),
Reason: string(gwv1.GatewayReasonProgrammed),
Message: fmt.Sprintf("NBRoutingPeer %s is not ready", routingPeerName),
}
meta.SetStatusCondition(&gw.Status.Conditions, cond)
@@ -120,9 +120,9 @@ func (r *GatewayReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
// Signal Gateway is programmed.
cond = metav1.Condition{
Type: string(gatewayv1.GatewayConditionProgrammed),
Type: string(gwv1.GatewayConditionProgrammed),
Status: metav1.ConditionTrue,
Reason: string(gatewayv1.GatewayReasonProgrammed),
Reason: string(gwv1.GatewayReasonProgrammed),
}
meta.SetStatusCondition(&gw.Status.Conditions, cond)
err = sp.Patch(ctx, gw)
@@ -132,8 +132,8 @@ func (r *GatewayReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
return ctrl.Result{}, nil
}
func (r *GatewayReconciler) reconcileDelete(ctx context.Context, sp *patch.SerialPatcher, gw *gatewayv1.Gateway) (ctrl.Result, error) {
var httpRouteList gatewayv1.HTTPRouteList
func (r *GatewayReconciler) reconcileDelete(ctx context.Context, sp *patch.SerialPatcher, gw *gwv1.Gateway) (ctrl.Result, error) {
var httpRouteList gwv1.HTTPRouteList
err := r.Client.List(ctx, &httpRouteList)
if err != nil {
return ctrl.Result{}, err
@@ -169,6 +169,6 @@ func (r *GatewayReconciler) reconcileDelete(ctx context.Context, sp *patch.Seria
func (r *GatewayReconciler) SetupWithManager(mgr ctrl.Manager) error {
return ctrl.NewControllerManagedBy(mgr).
For(&gatewayv1.Gateway{}).
For(&gwv1.Gateway{}).
Complete(r)
}
+11 -10
View File
@@ -5,13 +5,14 @@ import (
"time"
"github.com/fluxcd/pkg/runtime/patch"
"github.com/netbirdio/kubernetes-operator/internal/k8sutil"
"k8s.io/apimachinery/pkg/api/meta"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
gatewayv1 "sigs.k8s.io/gateway-api/apis/v1"
gwv1 "sigs.k8s.io/gateway-api/apis/v1"
"github.com/netbirdio/kubernetes-operator/internal/k8sutil"
)
const (
@@ -23,7 +24,7 @@ type GatewayClassReconciler struct {
}
func (r *GatewayClassReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
gwc := &gatewayv1.GatewayClass{}
gwc := &gwv1.GatewayClass{}
err := r.Client.Get(ctx, req.NamespacedName, gwc)
if err != nil {
return ctrl.Result{}, client.IgnoreNotFound(err)
@@ -52,9 +53,9 @@ func (r *GatewayClassReconciler) Reconcile(ctx context.Context, req ctrl.Request
}()
if message != "" {
cond := metav1.Condition{
Type: string(gatewayv1.GatewayClassConditionStatusAccepted),
Type: string(gwv1.GatewayClassConditionStatusAccepted),
Status: metav1.ConditionFalse,
Reason: string(gatewayv1.GatewayClassReasonInvalidParameters),
Reason: string(gwv1.GatewayClassReasonInvalidParameters),
Message: message,
}
meta.SetStatusCondition(&gwc.Status.Conditions, cond)
@@ -68,9 +69,9 @@ func (r *GatewayClassReconciler) Reconcile(ctx context.Context, req ctrl.Request
// Set condition to accepted.
controllerutil.AddFinalizer(gwc, k8sutil.Finalizer("gatewayclass"))
cond := metav1.Condition{
Type: string(gatewayv1.GatewayClassConditionStatusAccepted),
Type: string(gwv1.GatewayClassConditionStatusAccepted),
Status: metav1.ConditionTrue,
Reason: string(gatewayv1.GatewayClassReasonAccepted),
Reason: string(gwv1.GatewayClassReasonAccepted),
Message: "Reconciled by Netbird Operator.",
}
meta.SetStatusCondition(&gwc.Status.Conditions, cond)
@@ -81,8 +82,8 @@ func (r *GatewayClassReconciler) Reconcile(ctx context.Context, req ctrl.Request
return ctrl.Result{}, nil
}
func (r *GatewayClassReconciler) reconcileDelete(ctx context.Context, sp *patch.SerialPatcher, gwc *gatewayv1.GatewayClass) (ctrl.Result, error) {
var gatewayList gatewayv1.GatewayList
func (r *GatewayClassReconciler) reconcileDelete(ctx context.Context, sp *patch.SerialPatcher, gwc *gwv1.GatewayClass) (ctrl.Result, error) {
var gatewayList gwv1.GatewayList
err := r.Client.List(ctx, &gatewayList)
if err != nil {
return ctrl.Result{}, err
@@ -104,6 +105,6 @@ func (r *GatewayClassReconciler) reconcileDelete(ctx context.Context, sp *patch.
// SetupWithManager sets up the controller with the Manager.
func (r *GatewayClassReconciler) SetupWithManager(mgr ctrl.Manager) error {
return ctrl.NewControllerManagedBy(mgr).
For(&gatewayv1.GatewayClass{}).
For(&gwv1.GatewayClass{}).
Complete(r)
}
+3 -2
View File
@@ -5,12 +5,13 @@ import (
"github.com/fluxcd/pkg/runtime/conditions"
"github.com/fluxcd/pkg/runtime/patch"
netbird "github.com/netbirdio/netbird/shared/management/client/rest"
"github.com/netbirdio/netbird/shared/management/http/api"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
netbird "github.com/netbirdio/netbird/shared/management/client/rest"
"github.com/netbirdio/netbird/shared/management/http/api"
nbv1alpha1 "github.com/netbirdio/kubernetes-operator/api/v1alpha1"
"github.com/netbirdio/kubernetes-operator/internal/k8sutil"
)
+8 -7
View File
@@ -6,8 +6,6 @@ import (
"github.com/fluxcd/pkg/runtime/conditions"
"github.com/fluxcd/pkg/runtime/patch"
netbird "github.com/netbirdio/netbird/shared/management/client/rest"
"github.com/netbirdio/netbird/shared/management/http/api"
corev1 "k8s.io/api/core/v1"
kerrors "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/api/meta"
@@ -15,7 +13,10 @@ import (
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
gatewayv1 "sigs.k8s.io/gateway-api/apis/v1"
gwv1 "sigs.k8s.io/gateway-api/apis/v1"
netbird "github.com/netbirdio/netbird/shared/management/client/rest"
"github.com/netbirdio/netbird/shared/management/http/api"
nbv1alpha1 "github.com/netbirdio/kubernetes-operator/api/v1alpha1"
"github.com/netbirdio/kubernetes-operator/internal/gatewayutil"
@@ -38,7 +39,7 @@ type HTTPRouteReconciler struct {
func (r *HTTPRouteReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
logger := ctrl.Log.WithName("HTTPRoute").WithValues("namespace", req.Namespace, "name", req.Name)
hr := &gatewayv1.HTTPRoute{}
hr := &gwv1.HTTPRoute{}
err := r.Get(ctx, req.NamespacedName, hr)
if err != nil {
return ctrl.Result{}, client.IgnoreNotFound(err)
@@ -57,7 +58,7 @@ func (r *HTTPRouteReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
if gw == nil {
continue
}
if !meta.IsStatusConditionTrue(gw.Status.Conditions, string(gatewayv1.GatewayConditionProgrammed)) {
if !meta.IsStatusConditionTrue(gw.Status.Conditions, string(gwv1.GatewayConditionProgrammed)) {
logger.Info("gateway is not ready", "name", gw.ObjectMeta.Name)
continue
}
@@ -176,7 +177,7 @@ func (r *HTTPRouteReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
return ctrl.Result{}, nil
}
func (r *HTTPRouteReconciler) reconcileDelete(ctx context.Context, sp *patch.SerialPatcher, hr *gatewayv1.HTTPRoute) (ctrl.Result, error) {
func (r *HTTPRouteReconciler) reconcileDelete(ctx context.Context, sp *patch.SerialPatcher, hr *gwv1.HTTPRoute) (ctrl.Result, error) {
// Index all proxy services.
proxyServices, err := r.Netbird.ReverseProxyServices.List(ctx)
if err != nil {
@@ -266,6 +267,6 @@ func (r *HTTPRouteReconciler) reconcileDelete(ctx context.Context, sp *patch.Ser
// SetupWithManager sets up the controller with the Manager.
func (r *HTTPRouteReconciler) SetupWithManager(mgr ctrl.Manager) error {
return ctrl.NewControllerManagedBy(mgr).
For(&gatewayv1.HTTPRoute{}).
For(&gwv1.HTTPRoute{}).
Complete(r)
}
+15 -14
View File
@@ -7,13 +7,14 @@ import (
"time"
"github.com/go-logr/logr"
netbird "github.com/netbirdio/netbird/shared/management/client/rest"
"github.com/netbirdio/netbird/shared/management/http/api"
"k8s.io/apimachinery/pkg/api/errors"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
netbirdiov1 "github.com/netbirdio/kubernetes-operator/api/v1"
netbird "github.com/netbirdio/netbird/shared/management/client/rest"
"github.com/netbirdio/netbird/shared/management/http/api"
nbv1 "github.com/netbirdio/kubernetes-operator/api/v1"
"github.com/netbirdio/kubernetes-operator/internal/util"
)
@@ -39,7 +40,7 @@ func (r *NBGroupReconciler) Reconcile(ctx context.Context, req ctrl.Request) (re
logger := ctrl.Log.WithName("NBGroup").WithValues("namespace", req.Namespace, "name", req.Name)
logger.Info("Reconciling NBGroup")
nbGroup := netbirdiov1.NBGroup{}
nbGroup := nbv1.NBGroup{}
err = r.Client.Get(ctx, req.NamespacedName, &nbGroup)
if err != nil {
if !errors.IsNotFound(err) {
@@ -78,7 +79,7 @@ func (r *NBGroupReconciler) Reconcile(ctx context.Context, req ctrl.Request) (re
}
// syncNetBirdGroup reconciliation logic for non-deleted objects.
func (r *NBGroupReconciler) syncNetBirdGroup(ctx context.Context, nbGroup *netbirdiov1.NBGroup, logger logr.Logger) (ctrl.Result, error) {
func (r *NBGroupReconciler) syncNetBirdGroup(ctx context.Context, nbGroup *nbv1.NBGroup, logger logr.Logger) (ctrl.Result, error) {
// Get all NetBird groups to ensure no group duplication
groups, err := r.Netbird.Groups.List(ctx)
if err != nil {
@@ -99,37 +100,37 @@ func (r *NBGroupReconciler) syncNetBirdGroup(ctx context.Context, nbGroup *netbi
Name: nbGroup.Spec.Name,
})
if err != nil {
nbGroup.Status.Conditions = netbirdiov1.NBConditionFalse("APIError", fmt.Sprintf("NetBird API Error: %v", err))
nbGroup.Status.Conditions = nbv1.NBConditionFalse("APIError", fmt.Sprintf("NetBird API Error: %v", err))
logger.Error(errNetBirdAPI, "error creating group", "err", err)
return ctrl.Result{}, err
}
logger.Info("NBGroup: Created group on NetBird", "name", nbGroup.Spec.Name, "id", group.Id)
nbGroup.Status.GroupID = &group.Id
nbGroup.Status.Conditions = netbirdiov1.NBConditionTrue()
nbGroup.Status.Conditions = nbv1.NBConditionTrue()
} else if nbGroup.Status.GroupID == nil && group != nil {
logger.Info("NBGroup: Found group with same name on NetBird", "name", nbGroup.Spec.Name, "id", group.Id)
nbGroup.Status.GroupID = &group.Id
nbGroup.Status.Conditions = netbirdiov1.NBConditionTrue()
nbGroup.Status.Conditions = nbv1.NBConditionTrue()
} else if group == nil {
logger.Info("NBGroup: Group was deleted", "name", nbGroup.Spec.Name, "id", *nbGroup.Status.GroupID)
nbGroup.Status.GroupID = nil
nbGroup.Status.Conditions = netbirdiov1.NBConditionFalse("GroupGone", "Group was deleted from NetBird API")
nbGroup.Status.Conditions = nbv1.NBConditionFalse("GroupGone", "Group was deleted from NetBird API")
return ctrl.Result{Requeue: true}, nil
} else {
nbGroup.Status.Conditions = netbirdiov1.NBConditionTrue()
nbGroup.Status.Conditions = nbv1.NBConditionTrue()
}
if nbGroup.Status.GroupID != nil && group != nil && *nbGroup.Status.GroupID != group.Id {
// There are two possibilities here, either someone deleted and created the group in NetBird, thus the changed ID
// Or there's a conflict with something else, either way, we just need to take the new ID here
nbGroup.Status.GroupID = &group.Id
nbGroup.Status.Conditions = netbirdiov1.NBConditionTrue()
nbGroup.Status.Conditions = nbv1.NBConditionTrue()
}
return ctrl.Result{}, nil
}
func (r *NBGroupReconciler) handleDelete(ctx context.Context, nbGroup netbirdiov1.NBGroup, logger logr.Logger) error {
func (r *NBGroupReconciler) handleDelete(ctx context.Context, nbGroup nbv1.NBGroup, logger logr.Logger) error {
// Group doesn't exist on NetBird, no need for cleanup
if nbGroup.Status.GroupID == nil {
nbGroup.Finalizers = util.Without(nbGroup.Finalizers, "netbird.io/group-cleanup")
@@ -151,7 +152,7 @@ func (r *NBGroupReconciler) handleDelete(ctx context.Context, nbGroup netbirdiov
if err != nil && strings.Contains(err.Error(), "linked") && !nbGroup.DeletionTimestamp.Add(time.Minute).Before(time.Now()) {
logger.Info("group still linked to resources on netbird", "err", err)
// Check if group is defined elsewhere in the cluster
var groups netbirdiov1.NBGroupList
var groups nbv1.NBGroupList
listErr := r.Client.List(ctx, &groups)
if listErr != nil {
logger.Error(errKubernetesAPI, "error listing NBGroups", "err", listErr)
@@ -192,7 +193,7 @@ func (r *NBGroupReconciler) handleDelete(ctx context.Context, nbGroup netbirdiov
// SetupWithManager sets up the controller with the Manager.
func (r *NBGroupReconciler) SetupWithManager(mgr ctrl.Manager) error {
return ctrl.NewControllerManagedBy(mgr).
For(&netbirdiov1.NBGroup{}).
For(&nbv1.NBGroup{}).
Named("nbgroup").
Complete(r)
}
+20 -19
View File
@@ -9,14 +9,15 @@ import (
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
"k8s.io/apimachinery/pkg/api/errors"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types"
"sigs.k8s.io/controller-runtime/pkg/reconcile"
netbirdiov1 "github.com/netbirdio/kubernetes-operator/api/v1"
"github.com/netbirdio/kubernetes-operator/internal/util"
netbird "github.com/netbirdio/netbird/shared/management/client/rest"
"github.com/netbirdio/netbird/shared/management/http/api"
nbv1 "github.com/netbirdio/kubernetes-operator/api/v1"
"github.com/netbirdio/kubernetes-operator/internal/util"
)
var _ = Describe("NBGroup Controller", func() {
@@ -33,7 +34,7 @@ var _ = Describe("NBGroup Controller", func() {
var netbirdClient *netbird.Client
var mux *http.ServeMux
var server *httptest.Server
var nbGroup netbirdiov1.NBGroup
var nbGroup nbv1.NBGroup
BeforeEach(func() {
mux = &http.ServeMux{}
@@ -46,13 +47,13 @@ var _ = Describe("NBGroup Controller", func() {
Expect(deleteErr).NotTo(HaveOccurred())
}
if err == nil || errors.IsNotFound(err) {
nbGroup = netbirdiov1.NBGroup{
ObjectMeta: v1.ObjectMeta{
nbGroup = nbv1.NBGroup{
ObjectMeta: metav1.ObjectMeta{
Name: resourceName,
Namespace: typeNamespacedName.Namespace,
Finalizers: []string{"netbird.io/group-cleanup"},
},
Spec: netbirdiov1.NBGroupSpec{
Spec: nbv1.NBGroupSpec{
Name: resourceName,
},
}
@@ -63,7 +64,7 @@ var _ = Describe("NBGroup Controller", func() {
AfterEach(func() {
server.Close()
resource := &netbirdiov1.NBGroup{}
resource := &nbv1.NBGroup{}
err := k8sClient.Get(ctx, typeNamespacedName, resource)
if errors.IsNotFound(err) {
return
@@ -113,8 +114,8 @@ var _ = Describe("NBGroup Controller", func() {
Expect(nbGroup.Status.GroupID).NotTo(BeNil())
Expect(*nbGroup.Status.GroupID).To(Equal("Test"))
Expect(nbGroup.Status.Conditions).To(HaveLen(1))
Expect(nbGroup.Status.Conditions[0].Status).To(BeEquivalentTo(v1.ConditionTrue))
Expect(nbGroup.Status.Conditions[0].Type).To(Equal(netbirdiov1.NBSetupKeyReady))
Expect(nbGroup.Status.Conditions[0].Status).To(BeEquivalentTo(metav1.ConditionTrue))
Expect(nbGroup.Status.Conditions[0].Type).To(Equal(nbv1.NBSetupKeyReady))
})
})
@@ -148,8 +149,8 @@ var _ = Describe("NBGroup Controller", func() {
Expect(nbGroup.Status.GroupID).NotTo(BeNil())
Expect(*nbGroup.Status.GroupID).To(Equal("Test"))
Expect(nbGroup.Status.Conditions).To(HaveLen(1))
Expect(nbGroup.Status.Conditions[0].Status).To(BeEquivalentTo(v1.ConditionTrue))
Expect(nbGroup.Status.Conditions[0].Type).To(Equal(netbirdiov1.NBSetupKeyReady))
Expect(nbGroup.Status.Conditions[0].Status).To(BeEquivalentTo(metav1.ConditionTrue))
Expect(nbGroup.Status.Conditions[0].Type).To(Equal(nbv1.NBSetupKeyReady))
})
})
@@ -222,12 +223,12 @@ var _ = Describe("NBGroup Controller", func() {
When("Group already exists in another namespace", func() {
It("Should delete NBGroup after linked failure", func() {
deleteGroup()
otherGroup := &netbirdiov1.NBGroup{
ObjectMeta: v1.ObjectMeta{
otherGroup := &nbv1.NBGroup{
ObjectMeta: metav1.ObjectMeta{
Name: nbGroup.Name,
Namespace: "kube-system",
},
Spec: netbirdiov1.NBGroupSpec{
Spec: nbv1.NBGroupSpec{
Name: nbGroup.Spec.Name,
},
}
@@ -294,8 +295,8 @@ var _ = Describe("NBGroup Controller", func() {
Expect(nbGroup.Status.GroupID).NotTo(BeNil())
Expect(*nbGroup.Status.GroupID).To(Equal("Test"))
Expect(nbGroup.Status.Conditions).To(HaveLen(1))
Expect(nbGroup.Status.Conditions[0].Status).To(BeEquivalentTo(v1.ConditionTrue))
Expect(nbGroup.Status.Conditions[0].Type).To(Equal(netbirdiov1.NBSetupKeyReady))
Expect(nbGroup.Status.Conditions[0].Status).To(BeEquivalentTo(metav1.ConditionTrue))
Expect(nbGroup.Status.Conditions[0].Type).To(Equal(nbv1.NBSetupKeyReady))
})
})
@@ -340,7 +341,7 @@ var _ = Describe("NBGroup Controller", func() {
Expect(nbGroup.Status.GroupID).To(BeNil())
Expect(nbGroup.Status.Conditions).To(HaveLen(1))
Expect(nbGroup.Status.Conditions[0].Status).To(BeEquivalentTo(v1.ConditionFalse))
Expect(nbGroup.Status.Conditions[0].Status).To(BeEquivalentTo(metav1.ConditionFalse))
_, err = controllerReconciler.Reconcile(ctx, reconcile.Request{
NamespacedName: typeNamespacedName,
@@ -353,7 +354,7 @@ var _ = Describe("NBGroup Controller", func() {
Expect(nbGroup.Status.GroupID).NotTo(BeNil())
Expect(*nbGroup.Status.GroupID).To(Equal("Test"))
Expect(nbGroup.Status.Conditions).To(HaveLen(1))
Expect(nbGroup.Status.Conditions[0].Status).To(BeEquivalentTo(v1.ConditionTrue))
Expect(nbGroup.Status.Conditions[0].Status).To(BeEquivalentTo(metav1.ConditionTrue))
})
})
})
+24 -23
View File
@@ -8,14 +8,15 @@ import (
"strings"
"github.com/go-logr/logr"
netbird "github.com/netbirdio/netbird/shared/management/client/rest"
"github.com/netbirdio/netbird/shared/management/http/api"
"k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/types"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
netbirdiov1 "github.com/netbirdio/kubernetes-operator/api/v1"
netbird "github.com/netbirdio/netbird/shared/management/client/rest"
"github.com/netbirdio/netbird/shared/management/http/api"
nbv1 "github.com/netbirdio/kubernetes-operator/api/v1"
"github.com/netbirdio/kubernetes-operator/internal/util"
)
@@ -39,16 +40,16 @@ const (
)
// getResources get all NBResource objects in policy.status.managedServiceList
func (r *NBPolicyReconciler) getResources(ctx context.Context, nbPolicy *netbirdiov1.NBPolicy, logger logr.Logger) ([]netbirdiov1.NBResource, error) {
var resourceList []netbirdiov1.NBResource
func (r *NBPolicyReconciler) getResources(ctx context.Context, nbPolicy *nbv1.NBPolicy, logger logr.Logger) ([]nbv1.NBResource, error) {
var resourceList []nbv1.NBResource
var updatedManagedServiceList []string
for _, rss := range nbPolicy.Status.ManagedServiceList {
var resource netbirdiov1.NBResource
var resource nbv1.NBResource
namespacedName := types.NamespacedName{Namespace: strings.Split(rss, "/")[0], Name: strings.Split(rss, "/")[1]}
err := r.Client.Get(ctx, namespacedName, &resource)
if err != nil && !errors.IsNotFound(err) {
logger.Error(errKubernetesAPI, "Error getting NBResource", "namespace", namespacedName.Namespace, "name", namespacedName.Name)
nbPolicy.Status.Conditions = netbirdiov1.NBConditionFalse("internalError", fmt.Sprintf("Error getting NBResource: %v", err))
nbPolicy.Status.Conditions = nbv1.NBConditionFalse("internalError", fmt.Sprintf("Error getting NBResource: %v", err))
return nil, err
}
if err == nil && resource.DeletionTimestamp == nil {
@@ -64,7 +65,7 @@ func (r *NBPolicyReconciler) getResources(ctx context.Context, nbPolicy *netbird
// mapResources map each NBResource ports and protocols into one object to generate the policy
// 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 *nbv1.NBPolicy, resources []nbv1.NBResource, logger logr.Logger) (map[string][]int32, []string, error) {
portMapping := map[string]map[int32]any{
protocolTCP: make(map[int32]any),
protocolUDP: make(map[int32]any),
@@ -113,7 +114,7 @@ func (r *NBPolicyReconciler) mapResources(ctx context.Context, nbPolicy *netbird
}
// createPolicy helper for creating policy with settings
func (r *NBPolicyReconciler) createPolicy(ctx context.Context, nbPolicy *netbirdiov1.NBPolicy, protocol string, sourceGroupIDs, destinationGroupIDs, ports []string, logger logr.Logger) (*string, error) {
func (r *NBPolicyReconciler) createPolicy(ctx context.Context, nbPolicy *nbv1.NBPolicy, protocol string, sourceGroupIDs, destinationGroupIDs, ports []string, logger logr.Logger) (*string, error) {
policyName := fmt.Sprintf("%s %s", nbPolicy.Spec.Name, strings.ToUpper(protocol))
logger.Info("Creating NetBird Policy", "name", policyName, "description", nbPolicy.Spec.Description, "protocol", protocol, "sources", sourceGroupIDs, "destinations", destinationGroupIDs, "ports", ports, "bidirectional", nbPolicy.Spec.Bidirectional)
policy, err := r.Netbird.Policies.Create(ctx, api.PostApiPoliciesJSONRequestBody{
@@ -137,7 +138,7 @@ func (r *NBPolicyReconciler) createPolicy(ctx context.Context, nbPolicy *netbird
if err != nil {
logger.Error(errNetBirdAPI, "Error creating Policy", "err", err)
nbPolicy.Status.Conditions = netbirdiov1.NBConditionFalse("APIError", fmt.Sprintf("Error creating policy: %v", err))
nbPolicy.Status.Conditions = nbv1.NBConditionFalse("APIError", fmt.Sprintf("Error creating policy: %v", err))
return nil, err
}
@@ -145,7 +146,7 @@ func (r *NBPolicyReconciler) createPolicy(ctx context.Context, nbPolicy *netbird
}
// updatePolicy helper for updating policy with settings
func (r *NBPolicyReconciler) updatePolicy(ctx context.Context, policyID *string, nbPolicy *netbirdiov1.NBPolicy, protocol string, sourceGroupIDs, destinationGroupIDs, ports []string, logger logr.Logger) (*string, bool, error) {
func (r *NBPolicyReconciler) updatePolicy(ctx context.Context, policyID *string, nbPolicy *nbv1.NBPolicy, protocol string, sourceGroupIDs, destinationGroupIDs, ports []string, logger logr.Logger) (*string, bool, error) {
policyName := fmt.Sprintf("%s %s", nbPolicy.Spec.Name, strings.ToUpper(protocol))
logger.Info("Updating NetBird Policy", "name", policyName, "description", nbPolicy.Spec.Description, "protocol", protocol, "sources", sourceGroupIDs, "destinations", destinationGroupIDs, "ports", ports, "bidirectional", nbPolicy.Spec.Bidirectional)
_, err := r.Netbird.Policies.Update(ctx, *policyID, api.PutApiPoliciesPolicyIdJSONRequestBody{
@@ -169,7 +170,7 @@ func (r *NBPolicyReconciler) updatePolicy(ctx context.Context, policyID *string,
if err != nil && !strings.Contains(err.Error(), "not found") {
logger.Error(errNetBirdAPI, "Error updating Policy", "err", err)
nbPolicy.Status.Conditions = netbirdiov1.NBConditionFalse("APIError", fmt.Sprintf("Error updating policy: %v", err))
nbPolicy.Status.Conditions = nbv1.NBConditionFalse("APIError", fmt.Sprintf("Error updating policy: %v", err))
return policyID, false, err
}
@@ -179,7 +180,7 @@ func (r *NBPolicyReconciler) updatePolicy(ctx context.Context, policyID *string,
logger.Info("Policy deleted from NetBird API, recreating", "protocol", protocol)
policyID = nil
requeue = true
nbPolicy.Status.Conditions = netbirdiov1.NBConditionFalse("Gone", "Policy deleted from NetBird API")
nbPolicy.Status.Conditions = nbv1.NBConditionFalse("Gone", "Policy deleted from NetBird API")
} else if err != nil {
return nil, false, err
}
@@ -193,7 +194,7 @@ func (r *NBPolicyReconciler) Reconcile(ctx context.Context, req ctrl.Request) (r
logger := ctrl.Log.WithName("NBPolicy").WithValues("namespace", req.Namespace, "name", req.Name)
logger.Info("Reconciling NBPolicy")
var nbPolicy netbirdiov1.NBPolicy
var nbPolicy nbv1.NBPolicy
err = r.Client.Get(ctx, req.NamespacedName, &nbPolicy)
if err != nil {
if errors.IsNotFound(err) {
@@ -247,7 +248,7 @@ func (r *NBPolicyReconciler) Reconcile(ctx context.Context, req ctrl.Request) (r
sourceGroupIDs, err := r.groupNamesToIDs(ctx, nbPolicy.Spec.SourceGroups, logger)
if err != nil {
nbPolicy.Status.Conditions = netbirdiov1.NBConditionFalse("APIError", fmt.Sprintf("Error getting group IDs: %v", err))
nbPolicy.Status.Conditions = nbv1.NBConditionFalse("APIError", fmt.Sprintf("Error getting group IDs: %v", err))
return ctrl.Result{}, err
}
@@ -257,13 +258,13 @@ func (r *NBPolicyReconciler) Reconcile(ctx context.Context, req ctrl.Request) (r
return ctrl.Result{Requeue: requeue}, err
}
nbPolicy.Status.Conditions = netbirdiov1.NBConditionTrue()
nbPolicy.Status.Conditions = nbv1.NBConditionTrue()
return ctrl.Result{}, nil
}
// syncPolicy ensure upstream policy is up-to-date
func (r *NBPolicyReconciler) syncPolicy(ctx context.Context, nbPolicy *netbirdiov1.NBPolicy, sourceGroups, destGroups []string, portMapping map[string][]int32, logger logr.Logger) (bool, error) {
func (r *NBPolicyReconciler) syncPolicy(ctx context.Context, nbPolicy *nbv1.NBPolicy, sourceGroups, destGroups []string, portMapping map[string][]int32, logger logr.Logger) (bool, error) {
requeue := false
for protocol, ports := range portMapping {
@@ -275,7 +276,7 @@ func (r *NBPolicyReconciler) syncPolicy(ctx context.Context, nbPolicy *netbirdio
policyID = nbPolicy.Status.UDPPolicyID
default:
logger.Error(errKubernetesAPI, "Unknown protocol", "protocol", protocol)
nbPolicy.Status.Conditions = netbirdiov1.NBConditionFalse("ConfigError", fmt.Sprintf("Unknown protocol: %s", protocol))
nbPolicy.Status.Conditions = nbv1.NBConditionFalse("ConfigError", fmt.Sprintf("Unknown protocol: %s", protocol))
return requeue, errUnknownProtocol
}
@@ -284,7 +285,7 @@ func (r *NBPolicyReconciler) syncPolicy(ctx context.Context, nbPolicy *netbirdio
logger.Info("Deleting protocol policy as NBPolicy has restricted protocols", "protocol", protocol)
err := r.Netbird.Policies.Delete(ctx, *policyID)
if err != nil && !strings.Contains(err.Error(), "not found") {
nbPolicy.Status.Conditions = netbirdiov1.NBConditionFalse("APIError", fmt.Sprintf("Error deleting policy: %v", err))
nbPolicy.Status.Conditions = nbv1.NBConditionFalse("APIError", fmt.Sprintf("Error deleting policy: %v", err))
return requeue, err
}
policyID = nil
@@ -306,7 +307,7 @@ func (r *NBPolicyReconciler) syncPolicy(ctx context.Context, nbPolicy *netbirdio
logger.Info("Deleting policy", "protocol", protocol)
err := r.Netbird.Policies.Delete(ctx, *policyID)
if err != nil && !strings.Contains(err.Error(), "not found") {
nbPolicy.Status.Conditions = netbirdiov1.NBConditionFalse("APIError", fmt.Sprintf("Error deleting policy: %v", err))
nbPolicy.Status.Conditions = nbv1.NBConditionFalse("APIError", fmt.Sprintf("Error deleting policy: %v", err))
return requeue, err
}
policyID = nil
@@ -337,7 +338,7 @@ func (r *NBPolicyReconciler) syncPolicy(ctx context.Context, nbPolicy *netbirdio
nbPolicy.Status.UDPPolicyID = policyID
default:
logger.Error(errKubernetesAPI, "Unknown protocol", "protocol", protocol)
nbPolicy.Status.Conditions = netbirdiov1.NBConditionFalse("ConfigError", fmt.Sprintf("Unknown protocol: %s", protocol))
nbPolicy.Status.Conditions = nbv1.NBConditionFalse("ConfigError", fmt.Sprintf("Unknown protocol: %s", protocol))
return requeue, errUnknownProtocol
}
}
@@ -345,7 +346,7 @@ func (r *NBPolicyReconciler) syncPolicy(ctx context.Context, nbPolicy *netbirdio
return requeue, nil
}
func (r *NBPolicyReconciler) handleDelete(ctx context.Context, nbPolicy *netbirdiov1.NBPolicy, logger logr.Logger) error {
func (r *NBPolicyReconciler) handleDelete(ctx context.Context, nbPolicy *nbv1.NBPolicy, logger logr.Logger) error {
if nbPolicy.Status.TCPPolicyID != nil {
err := r.Netbird.Policies.Delete(ctx, *nbPolicy.Status.TCPPolicyID)
if err != nil && !strings.Contains("not found", err.Error()) {
@@ -395,7 +396,7 @@ func (r *NBPolicyReconciler) groupNamesToIDs(ctx context.Context, groupNames []s
// SetupWithManager sets up the controller with the Manager.
func (r *NBPolicyReconciler) SetupWithManager(mgr ctrl.Manager) error {
return ctrl.NewControllerManagedBy(mgr).
For(&netbirdiov1.NBPolicy{}).
For(&nbv1.NBPolicy{}).
Named("nbpolicy").
Complete(r)
}
+26 -26
View File
@@ -11,16 +11,16 @@ import (
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
"k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/reconcile"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
netbirdiov1 "github.com/netbirdio/kubernetes-operator/api/v1"
"github.com/netbirdio/kubernetes-operator/internal/util"
netbird "github.com/netbirdio/netbird/shared/management/client/rest"
"github.com/netbirdio/netbird/shared/management/http/api"
ctrl "sigs.k8s.io/controller-runtime"
nbv1 "github.com/netbirdio/kubernetes-operator/api/v1"
"github.com/netbirdio/kubernetes-operator/internal/util"
)
var _ = Describe("NBPolicy Controller", func() {
@@ -32,7 +32,7 @@ var _ = Describe("NBPolicy Controller", func() {
typeNamespacedName := types.NamespacedName{
Name: resourceName,
}
nbpolicy := &netbirdiov1.NBPolicy{}
nbpolicy := &nbv1.NBPolicy{}
var netbirdClient *netbird.Client
var mux *http.ServeMux
var server *httptest.Server
@@ -46,12 +46,12 @@ var _ = Describe("NBPolicy Controller", func() {
By("creating the custom resource for the Kind NBPolicy")
err := k8sClient.Get(ctx, typeNamespacedName, nbpolicy)
if err != nil && errors.IsNotFound(err) {
resource := &netbirdiov1.NBPolicy{
resource := &nbv1.NBPolicy{
ObjectMeta: metav1.ObjectMeta{
Name: resourceName,
Finalizers: []string{"netbird.io/cleanup"},
},
Spec: netbirdiov1.NBPolicySpec{
Spec: nbv1.NBPolicySpec{
Name: "Test",
SourceGroups: []string{"All"},
Bidirectional: true,
@@ -63,7 +63,7 @@ var _ = Describe("NBPolicy Controller", func() {
})
AfterEach(func() {
resource := &netbirdiov1.NBPolicy{}
resource := &nbv1.NBPolicy{}
err := k8sClient.Get(ctx, typeNamespacedName, resource)
if !errors.IsNotFound(err) {
Expect(err).NotTo(HaveOccurred())
@@ -77,7 +77,7 @@ var _ = Describe("NBPolicy Controller", func() {
Expect(k8sClient.Delete(ctx, resource)).To(Succeed())
}
nbresource := &netbirdiov1.NBResource{}
nbresource := &nbv1.NBResource{}
err = k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "test"}, nbresource)
if !errors.IsNotFound(err) {
Expect(err).NotTo(HaveOccurred())
@@ -120,12 +120,12 @@ var _ = Describe("NBPolicy Controller", func() {
Netbird: netbirdClient,
}
nbResource := &netbirdiov1.NBResource{
nbResource := &nbv1.NBResource{
ObjectMeta: metav1.ObjectMeta{
Name: "test",
Namespace: "default",
},
Spec: netbirdiov1.NBResourceSpec{
Spec: nbv1.NBResourceSpec{
Name: "meow",
Groups: []string{"test"},
NetworkID: "test",
@@ -136,7 +136,7 @@ var _ = Describe("NBPolicy Controller", func() {
}
Expect(k8sClient.Create(ctx, nbResource)).To(Succeed())
nbResource.Status = netbirdiov1.NBResourceStatus{
nbResource.Status = nbv1.NBResourceStatus{
TCPPorts: []int32{443},
PolicyName: &resourceName,
Groups: []string{"test"},
@@ -258,12 +258,12 @@ var _ = Describe("NBPolicy Controller", func() {
Netbird: netbirdClient,
}
nbResource := &netbirdiov1.NBResource{
nbResource := &nbv1.NBResource{
ObjectMeta: metav1.ObjectMeta{
Name: "test",
Namespace: "default",
},
Spec: netbirdiov1.NBResourceSpec{
Spec: nbv1.NBResourceSpec{
Name: "meow",
Groups: []string{"test"},
NetworkID: "test",
@@ -274,7 +274,7 @@ var _ = Describe("NBPolicy Controller", func() {
}
Expect(k8sClient.Create(ctx, nbResource)).To(Succeed())
nbResource.Status = netbirdiov1.NBResourceStatus{
nbResource.Status = nbv1.NBResourceStatus{
UDPPorts: []int32{443},
PolicyName: &resourceName,
Groups: []string{"test"},
@@ -396,12 +396,12 @@ var _ = Describe("NBPolicy Controller", func() {
Netbird: netbirdClient,
}
nbResource := &netbirdiov1.NBResource{
nbResource := &nbv1.NBResource{
ObjectMeta: metav1.ObjectMeta{
Name: "test",
Namespace: "default",
},
Spec: netbirdiov1.NBResourceSpec{
Spec: nbv1.NBResourceSpec{
Name: "meow",
Groups: []string{"test"},
NetworkID: "test",
@@ -412,7 +412,7 @@ var _ = Describe("NBPolicy Controller", func() {
}
Expect(k8sClient.Create(ctx, nbResource)).To(Succeed())
nbResource.Status = netbirdiov1.NBResourceStatus{
nbResource.Status = nbv1.NBResourceStatus{
TCPPorts: []int32{443},
PolicyName: &resourceName,
Groups: []string{"test"},
@@ -459,7 +459,7 @@ var _ = Describe("NBPolicy Controller", func() {
When("Updating existing policy", func() {
AfterEach(func() {
nbresource := &netbirdiov1.NBResource{}
nbresource := &nbv1.NBResource{}
err := k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "test-b"}, nbresource)
if !errors.IsNotFound(err) {
Expect(err).NotTo(HaveOccurred())
@@ -475,12 +475,12 @@ var _ = Describe("NBPolicy Controller", func() {
Netbird: netbirdClient,
}
nbResource := &netbirdiov1.NBResource{
nbResource := &nbv1.NBResource{
ObjectMeta: metav1.ObjectMeta{
Name: "test",
Namespace: "default",
},
Spec: netbirdiov1.NBResourceSpec{
Spec: nbv1.NBResourceSpec{
Name: "meow",
Groups: []string{"test"},
NetworkID: "test",
@@ -491,19 +491,19 @@ var _ = Describe("NBPolicy Controller", func() {
}
Expect(k8sClient.Create(ctx, nbResource)).To(Succeed())
nbResource.Status = netbirdiov1.NBResourceStatus{
nbResource.Status = nbv1.NBResourceStatus{
TCPPorts: []int32{443},
PolicyName: &resourceName,
Groups: []string{"test"},
}
Expect(k8sClient.Status().Update(ctx, nbResource)).To(Succeed())
nbResourceB := &netbirdiov1.NBResource{
nbResourceB := &nbv1.NBResource{
ObjectMeta: metav1.ObjectMeta{
Name: "test-b",
Namespace: "default",
},
Spec: netbirdiov1.NBResourceSpec{
Spec: nbv1.NBResourceSpec{
Name: "meow-b",
Groups: []string{"test-b"},
NetworkID: "test",
@@ -514,7 +514,7 @@ var _ = Describe("NBPolicy Controller", func() {
}
Expect(k8sClient.Create(ctx, nbResourceB)).To(Succeed())
nbResourceB.Status = netbirdiov1.NBResourceStatus{
nbResourceB.Status = nbv1.NBResourceStatus{
TCPPorts: []int32{80},
PolicyName: &resourceName,
Groups: []string{"test-b"},
+47 -46
View File
@@ -2,17 +2,15 @@ package controller
import (
"context"
nerrors "errors"
"errors"
"fmt"
"slices"
"strings"
"time"
"github.com/go-logr/logr"
netbird "github.com/netbirdio/netbird/shared/management/client/rest"
"github.com/netbirdio/netbird/shared/management/http/api"
kerrors "k8s.io/apimachinery/pkg/api/errors"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
@@ -21,7 +19,10 @@ import (
"sigs.k8s.io/controller-runtime/pkg/log"
"sigs.k8s.io/controller-runtime/pkg/reconcile"
netbirdiov1 "github.com/netbirdio/kubernetes-operator/api/v1"
netbird "github.com/netbirdio/netbird/shared/management/client/rest"
"github.com/netbirdio/netbird/shared/management/http/api"
nbv1 "github.com/netbirdio/kubernetes-operator/api/v1"
"github.com/netbirdio/kubernetes-operator/internal/util"
)
@@ -49,7 +50,7 @@ func (r *NBResourceReconciler) Reconcile(ctx context.Context, req ctrl.Request)
logger := ctrl.Log.WithName("NBResource").WithValues("namespace", req.Namespace, "name", req.Name)
logger.Info("Reconciling NBResource")
nbResource := &netbirdiov1.NBResource{}
nbResource := &nbv1.NBResource{}
err = r.Client.Get(ctx, req.NamespacedName, nbResource)
if err != nil {
if !kerrors.IsNotFound(err) {
@@ -98,17 +99,17 @@ func (r *NBResourceReconciler) Reconcile(ctx context.Context, req ctrl.Request)
groupIDs, result, err := r.handleGroups(ctx, req, nbResource, logger)
if result != nil {
nbResource.Status.Conditions = netbirdiov1.NBConditionFalse("internalError", fmt.Sprintf("Error occurred handling groups: %v", err))
nbResource.Status.Conditions = nbv1.NBConditionFalse("internalError", fmt.Sprintf("Error occurred handling groups: %v", err))
return *result, err
}
resource, err := r.handleNetBirdResource(ctx, nbResource, groupIDs, logger)
if err != nil && nerrors.Is(err, errDuplicateResource) {
if err != nil && errors.Is(err, errDuplicateResource) {
return ctrl.Result{RequeueAfter: defaultRequeueAfter}, nil
}
if err != nil {
nbResource.Status.Conditions = netbirdiov1.NBConditionFalse("internalError", fmt.Sprintf("Error occurred handling NetBird Network Resource: %v", err))
nbResource.Status.Conditions = nbv1.NBConditionFalse("internalError", fmt.Sprintf("Error occurred handling NetBird Network Resource: %v", err))
return ctrl.Result{}, err
}
@@ -119,22 +120,22 @@ func (r *NBResourceReconciler) Reconcile(ctx context.Context, req ctrl.Request)
err = r.handleGroupUpdate(ctx, nbResource, groupIDs, resource, logger)
if err != nil {
nbResource.Status.Conditions = netbirdiov1.NBConditionFalse("internalError", fmt.Sprintf("Error occurred handling groups: %v", err))
nbResource.Status.Conditions = nbv1.NBConditionFalse("internalError", fmt.Sprintf("Error occurred handling groups: %v", err))
return ctrl.Result{}, err
}
err = r.handlePolicy(ctx, req, nbResource, groupIDs, logger)
if err != nil {
nbResource.Status.Conditions = netbirdiov1.NBConditionFalse("internalError", fmt.Sprintf("Error occurred handling policy changes: %v", err))
nbResource.Status.Conditions = nbv1.NBConditionFalse("internalError", fmt.Sprintf("Error occurred handling policy changes: %v", err))
return ctrl.Result{}, err
}
nbResource.Status.Conditions = netbirdiov1.NBConditionTrue()
nbResource.Status.Conditions = nbv1.NBConditionTrue()
return ctrl.Result{}, nil
}
func (r *NBResourceReconciler) handlePolicyCreate(ctx context.Context, nbResource *netbirdiov1.NBResource, req ctrl.Request, policy string, nbPolicy *netbirdiov1.NBPolicy, logger logr.Logger) error {
func (r *NBResourceReconciler) handlePolicyCreate(ctx context.Context, nbResource *nbv1.NBResource, req ctrl.Request, policy string, nbPolicy *nbv1.NBPolicy, logger logr.Logger) error {
if len(nbResource.Spec.PolicySourceGroups) == 0 {
logger.Error(errInvalidValue, "Cannot auto-generate policy, missing source groups.")
return fmt.Errorf("cannot auto-generate policy, missing source groups")
@@ -144,14 +145,14 @@ func (r *NBResourceReconciler) handlePolicyCreate(ctx context.Context, nbResourc
name = fmt.Sprintf("Autogenerated policy for resource %s/%s in cluster %s", nbResource.Namespace, nbResource.Name, r.ClusterName)
}
generatedName := fmt.Sprintf("%s-%s-%s", policy, req.Namespace, req.Name)
*nbPolicy = netbirdiov1.NBPolicy{
ObjectMeta: v1.ObjectMeta{
*nbPolicy = nbv1.NBPolicy{
ObjectMeta: metav1.ObjectMeta{
Name: generatedName,
Annotations: map[string]string{"netbird.io/generated-by": req.NamespacedName.String()},
Finalizers: []string{"netbird.io/cleanup"},
Labels: r.DefaultLabels,
},
Spec: netbirdiov1.NBPolicySpec{
Spec: nbv1.NBPolicySpec{
Name: name,
Description: "Generated by " + req.NamespacedName.String(),
SourceGroups: nbResource.Spec.PolicySourceGroups,
@@ -172,7 +173,7 @@ func (r *NBResourceReconciler) handlePolicyCreate(ctx context.Context, nbResourc
}
nbPolicy.Labels = r.DefaultLabels
nbPolicy.Annotations["netbird.io/generated-by"] = req.NamespacedName.String()
nbPolicy.Spec = netbirdiov1.NBPolicySpec{
nbPolicy.Spec = nbv1.NBPolicySpec{
Name: name,
Description: "Generated by " + req.NamespacedName.String(),
SourceGroups: nbResource.Spec.PolicySourceGroups,
@@ -205,8 +206,8 @@ func (r *NBResourceReconciler) handlePolicyCreate(ctx context.Context, nbResourc
return nil
}
func (r *NBResourceReconciler) handlePolicyAddUpdate(ctx context.Context, req ctrl.Request, nbResource *netbirdiov1.NBResource, policy string, groupIDs []string, logger logr.Logger) error {
var nbPolicy netbirdiov1.NBPolicy
func (r *NBResourceReconciler) handlePolicyAddUpdate(ctx context.Context, req ctrl.Request, nbResource *nbv1.NBResource, policy string, groupIDs []string, logger logr.Logger) error {
var nbPolicy nbv1.NBPolicy
updatePolicyStatus := false
kubernetesPolicyName := policy
@@ -234,19 +235,19 @@ func (r *NBResourceReconciler) handlePolicyAddUpdate(ctx context.Context, req ct
if !util.Equivalent(nbResource.Spec.TCPPorts, nbResource.Status.TCPPorts) {
nbResource.Status.TCPPorts = nbResource.Spec.TCPPorts
nbPolicy.Status.LastUpdatedAt = &v1.Time{Time: time.Now()}
nbPolicy.Status.LastUpdatedAt = &metav1.Time{Time: time.Now()}
updatePolicyStatus = true
}
if !util.Equivalent(nbResource.Spec.UDPPorts, nbResource.Status.UDPPorts) {
nbResource.Status.UDPPorts = nbResource.Spec.UDPPorts
nbPolicy.Status.LastUpdatedAt = &v1.Time{Time: time.Now()}
nbPolicy.Status.LastUpdatedAt = &metav1.Time{Time: time.Now()}
updatePolicyStatus = true
}
if !util.Equivalent(nbResource.Status.Groups, groupIDs) {
nbResource.Status.Groups = groupIDs
nbPolicy.Status.LastUpdatedAt = &v1.Time{Time: time.Now()}
nbPolicy.Status.LastUpdatedAt = &metav1.Time{Time: time.Now()}
updatePolicyStatus = true
}
@@ -301,8 +302,8 @@ func (r *NBResourceReconciler) handlePolicyAddUpdate(ctx context.Context, req ct
return nil
}
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
func (r *NBResourceReconciler) handlePolicyDelete(ctx context.Context, req ctrl.Request, nbResource *nbv1.NBResource, specPolicies []string, policy string, logger logr.Logger) error {
var nbPolicy nbv1.NBPolicy
if !slices.Contains(specPolicies, policy) {
kubeName := policy
if v, ok := nbResource.Status.PolicyNameMapping[policy]; ok {
@@ -326,7 +327,7 @@ func (r *NBResourceReconciler) handlePolicyDelete(ctx context.Context, req ctrl.
delete(nbResource.Status.PolicyNameMapping, policy)
} else if slices.Contains(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 = &metav1.Time{Time: time.Now()}
err := r.Client.Status().Update(ctx, &nbPolicy)
if err != nil {
logger.Error(errKubernetesAPI, "error updating NBPolicy", "err", err, "policyName", policy)
@@ -339,7 +340,7 @@ func (r *NBResourceReconciler) handlePolicyDelete(ctx context.Context, req ctrl.
}
// handlePolicy update NBPolicy if defined to add self reference to policy status
func (r *NBResourceReconciler) handlePolicy(ctx context.Context, req ctrl.Request, nbResource *netbirdiov1.NBResource, groupIDs []string, logger logr.Logger) error {
func (r *NBResourceReconciler) handlePolicy(ctx context.Context, req ctrl.Request, nbResource *nbv1.NBResource, groupIDs []string, logger logr.Logger) error {
if nbResource.Status.PolicyName == nil && nbResource.Spec.PolicyName == "" {
return nil
}
@@ -372,7 +373,7 @@ func (r *NBResourceReconciler) handlePolicy(ctx context.Context, req ctrl.Reques
}
// 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 *nbv1.NBResource, groupIDs []string, resource *api.NetworkResource, logger logr.Logger) error {
// Handle possible updated group IDs
groupIDMap := make(map[string]any)
for _, g := range groupIDs {
@@ -405,7 +406,7 @@ func (r *NBResourceReconciler) handleGroupUpdate(ctx context.Context, nbResource
}
// handleNetBirdResource sync NetBird Network Resource
func (r *NBResourceReconciler) handleNetBirdResource(ctx context.Context, nbResource *netbirdiov1.NBResource, groupIDs []string, logger logr.Logger) (*api.NetworkResource, error) {
func (r *NBResourceReconciler) handleNetBirdResource(ctx context.Context, nbResource *nbv1.NBResource, groupIDs []string, logger logr.Logger) (*api.NetworkResource, error) {
var resource *api.NetworkResource
var err error
if nbResource.Status.NetworkResourceID != nil {
@@ -428,7 +429,7 @@ func (r *NBResourceReconciler) handleNetBirdResource(ctx context.Context, nbReso
if err != nil && strings.Contains(err.Error(), "already exists") {
log.Log.Error(errNetBirdAPI, "network resource with the same name already exists", "err", err)
nbResource.Status.Conditions = netbirdiov1.NBConditionFalse("DuplicateName", "Resource name already exists")
nbResource.Status.Conditions = nbv1.NBConditionFalse("DuplicateName", "Resource name already exists")
return nil, errDuplicateResource
}
@@ -469,8 +470,8 @@ func (r *NBResourceReconciler) handleNetBirdResource(ctx context.Context, nbReso
}
// handleGroups create NBGroup objects for each group specified in NBResource
func (r *NBResourceReconciler) handleGroups(ctx context.Context, req ctrl.Request, nbResource *netbirdiov1.NBResource, logger logr.Logger) ([]string, *ctrl.Result, error) {
nbGroupList := netbirdiov1.NBGroupList{}
func (r *NBResourceReconciler) handleGroups(ctx context.Context, req ctrl.Request, nbResource *nbv1.NBResource, logger logr.Logger) ([]string, *ctrl.Result, error) {
nbGroupList := nbv1.NBGroupList{}
err := r.Client.List(ctx, &nbGroupList, &client.ListOptions{Namespace: req.Namespace})
if err != nil {
logger.Error(errKubernetesAPI, "error listing NBGroup", "err", err)
@@ -511,7 +512,7 @@ func (r *NBResourceReconciler) handleGroups(ctx context.Context, req ctrl.Reques
var groupIDs []string
for _, groupName := range nbResource.Spec.Groups {
nbGroup := netbirdiov1.NBGroup{}
nbGroup := nbv1.NBGroup{}
groupNameRFC := strings.ToLower(groupName)
groupNameRFC = strings.ReplaceAll(groupNameRFC, " ", "-")
err := r.Client.Get(ctx, types.NamespacedName{Namespace: req.Namespace, Name: groupNameRFC}, &nbGroup)
@@ -520,13 +521,13 @@ func (r *NBResourceReconciler) handleGroups(ctx context.Context, req ctrl.Reques
return nil, &ctrl.Result{}, err
} else if kerrors.IsNotFound(err) {
// Create NBGroup
nbGroup = netbirdiov1.NBGroup{
ObjectMeta: v1.ObjectMeta{
nbGroup = nbv1.NBGroup{
ObjectMeta: metav1.ObjectMeta{
Name: groupNameRFC,
Namespace: nbResource.Namespace,
OwnerReferences: []v1.OwnerReference{
OwnerReferences: []metav1.OwnerReference{
{
APIVersion: netbirdiov1.GroupVersion.Identifier(),
APIVersion: nbv1.GroupVersion.Identifier(),
Kind: "NBResource",
Name: nbResource.Name,
UID: nbResource.UID,
@@ -536,7 +537,7 @@ func (r *NBResourceReconciler) handleGroups(ctx context.Context, req ctrl.Reques
Finalizers: []string{"netbird.io/group-cleanup", "netbird.io/resource-cleanup"},
Labels: r.DefaultLabels,
},
Spec: netbirdiov1.NBGroupSpec{
Spec: nbv1.NBGroupSpec{
Name: groupName,
},
}
@@ -558,8 +559,8 @@ func (r *NBResourceReconciler) handleGroups(ctx context.Context, req ctrl.Reques
}
if !ownerExists {
nbGroup.OwnerReferences = append(nbGroup.OwnerReferences, v1.OwnerReference{
APIVersion: netbirdiov1.GroupVersion.Identifier(),
nbGroup.OwnerReferences = append(nbGroup.OwnerReferences, metav1.OwnerReference{
APIVersion: nbv1.GroupVersion.Identifier(),
Kind: "NBResource",
Name: nbResource.Name,
UID: nbResource.UID,
@@ -587,10 +588,10 @@ func (r *NBResourceReconciler) handleGroups(ctx context.Context, req ctrl.Reques
return groupIDs, nil, nil
}
func (r *NBResourceReconciler) reconcileDelete(ctx context.Context, req ctrl.Request, nbResource *netbirdiov1.NBResource) error {
func (r *NBResourceReconciler) reconcileDelete(ctx context.Context, req ctrl.Request, nbResource *nbv1.NBResource) error {
if nbResource.Status.PolicyName != nil {
for _, policy := range util.SplitTrim(*nbResource.Status.PolicyName, ",") {
var nbPolicy netbirdiov1.NBPolicy
var nbPolicy nbv1.NBPolicy
err := r.Client.Get(ctx, types.NamespacedName{Name: policy}, &nbPolicy)
if err != nil && !kerrors.IsNotFound(err) {
return err
@@ -598,7 +599,7 @@ func (r *NBResourceReconciler) reconcileDelete(ctx context.Context, req ctrl.Req
if !kerrors.IsNotFound(err) && slices.Contains(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 = &metav1.Time{Time: time.Now()}
err = r.Client.Status().Update(ctx, &nbPolicy)
if err != nil {
return err
@@ -614,7 +615,7 @@ func (r *NBResourceReconciler) reconcileDelete(ctx context.Context, req ctrl.Req
}
}
nbGroupList := netbirdiov1.NBGroupList{}
nbGroupList := nbv1.NBGroupList{}
err := r.Client.List(ctx, &nbGroupList, &client.ListOptions{Namespace: req.Namespace})
if err != nil {
return err
@@ -658,9 +659,9 @@ func (r *NBResourceReconciler) reconcileDelete(ctx context.Context, req ctrl.Req
// SetupWithManager sets up the controller with the Manager.
func (r *NBResourceReconciler) SetupWithManager(mgr ctrl.Manager) error {
return ctrl.NewControllerManagedBy(mgr).
For(&netbirdiov1.NBResource{}).
Watches(&netbirdiov1.NBGroup{}, handler.EnqueueRequestForOwner(mgr.GetScheme(), mgr.GetRESTMapper(), &netbirdiov1.NBResource{})).
Watches(&netbirdiov1.NBPolicy{}, handler.EnqueueRequestsFromMapFunc(func(ctx context.Context, obj client.Object) []reconcile.Request {
For(&nbv1.NBResource{}).
Watches(&nbv1.NBGroup{}, handler.EnqueueRequestForOwner(mgr.GetScheme(), mgr.GetRESTMapper(), &nbv1.NBResource{})).
Watches(&nbv1.NBPolicy{}, handler.EnqueueRequestsFromMapFunc(func(ctx context.Context, obj client.Object) []reconcile.Request {
if v, ok := obj.GetAnnotations()["netbird.io/generated-by"]; ok {
return []reconcile.Request{
{
File diff suppressed because it is too large Load Diff
+54 -53
View File
@@ -8,19 +8,20 @@ import (
"strings"
"time"
"github.com/go-logr/logr"
appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/errors"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/handler"
"github.com/go-logr/logr"
netbirdiov1 "github.com/netbirdio/kubernetes-operator/api/v1"
"github.com/netbirdio/kubernetes-operator/internal/util"
netbird "github.com/netbirdio/netbird/shared/management/client/rest"
"github.com/netbirdio/netbird/shared/management/http/api"
nbv1 "github.com/netbirdio/kubernetes-operator/api/v1"
"github.com/netbirdio/kubernetes-operator/internal/util"
)
// NBRoutingPeerReconciler reconciles a NBRoutingPeer object
@@ -41,7 +42,7 @@ func (r *NBRoutingPeerReconciler) Reconcile(ctx context.Context, req ctrl.Reques
logger := ctrl.Log.WithName("NBRoutingPeer").WithValues("namespace", req.Namespace, "name", req.Name)
logger.Info("Reconciling NBRoutingPeer")
nbrp := &netbirdiov1.NBRoutingPeer{}
nbrp := &nbv1.NBRoutingPeer{}
err = r.Get(ctx, req.NamespacedName, nbrp)
if err != nil {
if !errors.IsNotFound(err) {
@@ -109,17 +110,17 @@ func (r *NBRoutingPeerReconciler) Reconcile(ctx context.Context, req ctrl.Reques
return ctrl.Result{}, err
}
nbrp.Status.Conditions = netbirdiov1.NBConditionTrue()
nbrp.Status.Conditions = nbv1.NBConditionTrue()
return ctrl.Result{}, nil
}
// handleDeployment reconcile routing peer Deployment
func (r *NBRoutingPeerReconciler) handleDeployment(ctx context.Context, req ctrl.Request, nbrp *netbirdiov1.NBRoutingPeer, logger logr.Logger) error {
func (r *NBRoutingPeerReconciler) handleDeployment(ctx context.Context, req ctrl.Request, nbrp *nbv1.NBRoutingPeer, logger logr.Logger) error {
routingPeerDeployment := appsv1.Deployment{}
err := r.Client.Get(ctx, req.NamespacedName, &routingPeerDeployment)
if err != nil && !errors.IsNotFound(err) {
logger.Error(errKubernetesAPI, "error getting Deployment", "err", err)
nbrp.Status.Conditions = netbirdiov1.NBConditionFalse("internalError", fmt.Sprintf("error getting Deployment: %v", err))
nbrp.Status.Conditions = nbv1.NBConditionFalse("internalError", fmt.Sprintf("error getting Deployment: %v", err))
return err
}
@@ -135,12 +136,12 @@ func (r *NBRoutingPeerReconciler) handleDeployment(ctx context.Context, req ctrl
replicas = *nbrp.Spec.Replicas
}
routingPeerDeployment = appsv1.Deployment{
ObjectMeta: v1.ObjectMeta{
ObjectMeta: metav1.ObjectMeta{
Name: nbrp.Name,
Namespace: nbrp.Namespace,
OwnerReferences: []v1.OwnerReference{
OwnerReferences: []metav1.OwnerReference{
{
APIVersion: netbirdiov1.GroupVersion.Identifier(),
APIVersion: nbv1.GroupVersion.Identifier(),
Kind: "NBRoutingPeer",
Name: nbrp.Name,
UID: nbrp.UID,
@@ -152,13 +153,13 @@ func (r *NBRoutingPeerReconciler) handleDeployment(ctx context.Context, req ctrl
},
Spec: appsv1.DeploymentSpec{
Replicas: &replicas,
Selector: &v1.LabelSelector{
Selector: &metav1.LabelSelector{
MatchLabels: map[string]string{
"app.kubernetes.io/name": "netbird-router",
},
},
Template: corev1.PodTemplateSpec{
ObjectMeta: v1.ObjectMeta{
ObjectMeta: metav1.ObjectMeta{
Labels: podLabels,
},
Spec: corev1.PodSpec{
@@ -199,16 +200,16 @@ func (r *NBRoutingPeerReconciler) handleDeployment(ctx context.Context, req ctrl
err = r.Client.Create(ctx, &routingPeerDeployment)
if err != nil {
logger.Error(errKubernetesAPI, "error creating Deployment", "err", err)
nbrp.Status.Conditions = netbirdiov1.NBConditionFalse("internalError", fmt.Sprintf("error creating Deployment: %v", err))
nbrp.Status.Conditions = nbv1.NBConditionFalse("internalError", fmt.Sprintf("error creating Deployment: %v", err))
return err
}
} else if err == nil {
updatedDeployment := routingPeerDeployment.DeepCopy()
updatedDeployment.ObjectMeta.Name = nbrp.Name
updatedDeployment.ObjectMeta.Namespace = nbrp.Namespace
updatedDeployment.ObjectMeta.OwnerReferences = []v1.OwnerReference{
updatedDeployment.ObjectMeta.OwnerReferences = []metav1.OwnerReference{
{
APIVersion: netbirdiov1.GroupVersion.Identifier(),
APIVersion: nbv1.GroupVersion.Identifier(),
Kind: "NBRoutingPeer",
Name: nbrp.Name,
UID: nbrp.UID,
@@ -224,7 +225,7 @@ func (r *NBRoutingPeerReconciler) handleDeployment(ctx context.Context, req ctrl
replicas = *nbrp.Spec.Replicas
}
updatedDeployment.Spec.Replicas = &replicas
updatedDeployment.Spec.Selector = &v1.LabelSelector{
updatedDeployment.Spec.Selector = &metav1.LabelSelector{
MatchLabels: map[string]string{
"app.kubernetes.io/name": "netbird-router",
},
@@ -269,7 +270,7 @@ func (r *NBRoutingPeerReconciler) handleDeployment(ctx context.Context, req ctrl
err = r.Client.Patch(ctx, updatedDeployment, patch)
if err != nil {
logger.Error(errKubernetesAPI, "error updating Deployment", "err", err)
nbrp.Status.Conditions = netbirdiov1.NBConditionFalse("internalError", fmt.Sprintf("error updating Deployment: %v", err))
nbrp.Status.Conditions = nbv1.NBConditionFalse("internalError", fmt.Sprintf("error updating Deployment: %v", err))
return err
}
}
@@ -278,13 +279,13 @@ func (r *NBRoutingPeerReconciler) handleDeployment(ctx context.Context, req ctrl
}
// handleRouter reconcile network routing peer in NetBird management API
func (r *NBRoutingPeerReconciler) handleRouter(ctx context.Context, nbrp *netbirdiov1.NBRoutingPeer, nbGroup netbirdiov1.NBGroup, logger logr.Logger) error {
func (r *NBRoutingPeerReconciler) handleRouter(ctx context.Context, nbrp *nbv1.NBRoutingPeer, nbGroup nbv1.NBGroup, logger logr.Logger) error {
// Check NetworkRouter exists
routers, err := r.Netbird.Networks.Routers(*nbrp.Status.NetworkID).List(ctx)
if err != nil {
logger.Error(errNetBirdAPI, "error listing network routers", "err", err)
nbrp.Status.Conditions = netbirdiov1.NBConditionFalse("APIError", fmt.Sprintf("error listing network routers: %v", err))
nbrp.Status.Conditions = nbv1.NBConditionFalse("APIError", fmt.Sprintf("error listing network routers: %v", err))
return err
}
@@ -303,7 +304,7 @@ func (r *NBRoutingPeerReconciler) handleRouter(ctx context.Context, nbrp *netbir
if err != nil {
logger.Error(errNetBirdAPI, "error creating network router", "err", err)
nbrp.Status.Conditions = netbirdiov1.NBConditionFalse("APIError", fmt.Sprintf("error creating network router: %v", err))
nbrp.Status.Conditions = nbv1.NBConditionFalse("APIError", fmt.Sprintf("error creating network router: %v", err))
return err
}
@@ -321,7 +322,7 @@ func (r *NBRoutingPeerReconciler) handleRouter(ctx context.Context, nbrp *netbir
if err != nil {
logger.Error(errNetBirdAPI, "error updating network router", "err", err)
nbrp.Status.Conditions = netbirdiov1.NBConditionFalse("APIError", fmt.Sprintf("error updating network router: %v", err))
nbrp.Status.Conditions = nbv1.NBConditionFalse("APIError", fmt.Sprintf("error updating network router: %v", err))
return err
}
}
@@ -331,7 +332,7 @@ func (r *NBRoutingPeerReconciler) handleRouter(ctx context.Context, nbrp *netbir
}
// handleSetupKey reconcile setup key and regenerate if invalid
func (r *NBRoutingPeerReconciler) handleSetupKey(ctx context.Context, req ctrl.Request, nbrp *netbirdiov1.NBRoutingPeer, nbGroup netbirdiov1.NBGroup, logger logr.Logger) (*ctrl.Result, error) {
func (r *NBRoutingPeerReconciler) handleSetupKey(ctx context.Context, req ctrl.Request, nbrp *nbv1.NBRoutingPeer, nbGroup nbv1.NBGroup, logger logr.Logger) (*ctrl.Result, error) {
networkName := r.ClusterName
if r.NamespacedNetworks {
networkName += "-" + req.Namespace
@@ -349,19 +350,19 @@ func (r *NBRoutingPeerReconciler) handleSetupKey(ctx context.Context, req ctrl.R
if err != nil {
logger.Error(errNetBirdAPI, "error creating setup key", "err", err)
nbrp.Status.Conditions = netbirdiov1.NBConditionFalse("APIError", fmt.Sprintf("error creating setup key: %v", err))
nbrp.Status.Conditions = nbv1.NBConditionFalse("APIError", fmt.Sprintf("error creating setup key: %v", err))
return &ctrl.Result{}, err
}
nbrp.Status.SetupKeyID = &setupKey.Id
skSecret := corev1.Secret{
ObjectMeta: v1.ObjectMeta{
ObjectMeta: metav1.ObjectMeta{
Name: nbrp.Name,
Namespace: nbrp.Namespace,
OwnerReferences: []v1.OwnerReference{
OwnerReferences: []metav1.OwnerReference{
{
APIVersion: netbirdiov1.GroupVersion.Identifier(),
APIVersion: nbv1.GroupVersion.Identifier(),
Kind: "NBRoutingPeer",
Name: nbrp.Name,
UID: nbrp.UID,
@@ -389,7 +390,7 @@ func (r *NBRoutingPeerReconciler) handleSetupKey(ctx context.Context, req ctrl.R
if err != nil {
logger.Error(errKubernetesAPI, "error creating Secret", "err", err)
nbrp.Status.Conditions = netbirdiov1.NBConditionFalse("internalError", fmt.Sprintf("error creating secret: %v", err))
nbrp.Status.Conditions = nbv1.NBConditionFalse("internalError", fmt.Sprintf("error creating secret: %v", err))
return &ctrl.Result{}, err
}
} else {
@@ -397,7 +398,7 @@ func (r *NBRoutingPeerReconciler) handleSetupKey(ctx context.Context, req ctrl.R
setupKey, err := r.Netbird.SetupKeys.Get(ctx, *nbrp.Status.SetupKeyID)
if err != nil && !strings.Contains(err.Error(), "not found") {
logger.Error(errNetBirdAPI, "error getting setup key", "err", err)
nbrp.Status.Conditions = netbirdiov1.NBConditionFalse("APIError", fmt.Sprintf("error getting setup key: %v", err))
nbrp.Status.Conditions = nbv1.NBConditionFalse("APIError", fmt.Sprintf("error getting setup key: %v", err))
return &ctrl.Result{}, err
}
@@ -407,7 +408,7 @@ func (r *NBRoutingPeerReconciler) handleSetupKey(ctx context.Context, req ctrl.R
if err != nil {
logger.Error(errNetBirdAPI, "error deleting setup key", "err", err)
nbrp.Status.Conditions = netbirdiov1.NBConditionFalse("APIError", fmt.Sprintf("error deleting setup key: %v", err))
nbrp.Status.Conditions = nbv1.NBConditionFalse("APIError", fmt.Sprintf("error deleting setup key: %v", err))
return &ctrl.Result{}, err
}
}
@@ -422,7 +423,7 @@ func (r *NBRoutingPeerReconciler) handleSetupKey(ctx context.Context, req ctrl.R
err = r.Client.Get(ctx, req.NamespacedName, &skSecret)
if err != nil && !errors.IsNotFound(err) {
logger.Error(errKubernetesAPI, "error getting Secret", "err", err)
nbrp.Status.Conditions = netbirdiov1.NBConditionFalse("internalError", fmt.Sprintf("error getting secret: %v", err))
nbrp.Status.Conditions = nbv1.NBConditionFalse("internalError", fmt.Sprintf("error getting secret: %v", err))
return &ctrl.Result{}, err
}
@@ -433,13 +434,13 @@ func (r *NBRoutingPeerReconciler) handleSetupKey(ctx context.Context, req ctrl.R
if err != nil {
logger.Error(errNetBirdAPI, "error deleting setup key", "err", err)
nbrp.Status.Conditions = netbirdiov1.NBConditionFalse("APIError", fmt.Sprintf("error deleting setup key: %v", err))
nbrp.Status.Conditions = nbv1.NBConditionFalse("APIError", fmt.Sprintf("error deleting setup key: %v", err))
return &ctrl.Result{}, err
}
nbrp.Status.SetupKeyID = nil
nbrp.Status.Conditions = netbirdiov1.NBConditionFalse("Gone", "generated secret was deleted")
nbrp.Status.Conditions = nbv1.NBConditionFalse("Gone", "generated secret was deleted")
// Requeue to avoid repeating code
return &ctrl.Result{Requeue: true}, nil
}
@@ -449,29 +450,29 @@ func (r *NBRoutingPeerReconciler) handleSetupKey(ctx context.Context, req ctrl.R
}
// handleGroup creates/updates NBGroup for routing peer
func (r *NBRoutingPeerReconciler) handleGroup(ctx context.Context, req ctrl.Request, nbrp *netbirdiov1.NBRoutingPeer, logger logr.Logger) (*netbirdiov1.NBGroup, *ctrl.Result, error) {
func (r *NBRoutingPeerReconciler) handleGroup(ctx context.Context, req ctrl.Request, nbrp *nbv1.NBRoutingPeer, logger logr.Logger) (*nbv1.NBGroup, *ctrl.Result, error) {
networkName := r.ClusterName
if r.NamespacedNetworks {
networkName += "-" + req.Namespace
}
// Check if NetBird Group exists
nbGroup := netbirdiov1.NBGroup{}
nbGroup := nbv1.NBGroup{}
err := r.Client.Get(ctx, req.NamespacedName, &nbGroup)
if err != nil && !errors.IsNotFound(err) {
logger.Error(errKubernetesAPI, "error getting NBGroup", "err", err)
nbrp.Status.Conditions = netbirdiov1.NBConditionFalse("internalError", fmt.Sprintf("error getting NBGroup: %v", err))
nbrp.Status.Conditions = nbv1.NBConditionFalse("internalError", fmt.Sprintf("error getting NBGroup: %v", err))
return nil, &ctrl.Result{}, err
}
if errors.IsNotFound(err) {
nbGroup = netbirdiov1.NBGroup{
ObjectMeta: v1.ObjectMeta{
nbGroup = nbv1.NBGroup{
ObjectMeta: metav1.ObjectMeta{
Name: nbrp.Name,
Namespace: nbrp.Namespace,
OwnerReferences: []v1.OwnerReference{
OwnerReferences: []metav1.OwnerReference{
{
APIVersion: netbirdiov1.GroupVersion.Identifier(),
APIVersion: nbv1.GroupVersion.Identifier(),
Kind: "NBRoutingPeer",
Name: nbrp.Name,
UID: nbrp.UID,
@@ -481,7 +482,7 @@ func (r *NBRoutingPeerReconciler) handleGroup(ctx context.Context, req ctrl.Requ
Finalizers: []string{"netbird.io/group-cleanup", "netbird.io/routing-peer-cleanup"},
Labels: r.DefaultLabels,
},
Spec: netbirdiov1.NBGroupSpec{
Spec: nbv1.NBGroupSpec{
Name: networkName,
},
}
@@ -490,7 +491,7 @@ func (r *NBRoutingPeerReconciler) handleGroup(ctx context.Context, req ctrl.Requ
if err != nil {
logger.Error(errKubernetesAPI, "error creating NBGroup", "err", err)
nbrp.Status.Conditions = netbirdiov1.NBConditionFalse("internalError", fmt.Sprintf("error creating NBGroup: %v", err))
nbrp.Status.Conditions = nbv1.NBConditionFalse("internalError", fmt.Sprintf("error creating NBGroup: %v", err))
return nil, &ctrl.Result{}, err
}
@@ -507,7 +508,7 @@ func (r *NBRoutingPeerReconciler) handleGroup(ctx context.Context, req ctrl.Requ
}
// handleNetwork Create/Update NetBird Network
func (r *NBRoutingPeerReconciler) handleNetwork(ctx context.Context, req ctrl.Request, nbrp *netbirdiov1.NBRoutingPeer, logger logr.Logger) error {
func (r *NBRoutingPeerReconciler) handleNetwork(ctx context.Context, req ctrl.Request, nbrp *nbv1.NBRoutingPeer, logger logr.Logger) error {
networkName := r.ClusterName
if r.NamespacedNetworks {
networkName += "-" + req.Namespace
@@ -518,7 +519,7 @@ func (r *NBRoutingPeerReconciler) handleNetwork(ctx context.Context, req ctrl.Re
networks, err := r.Netbird.Networks.List(ctx)
if err != nil {
logger.Error(errNetBirdAPI, "error listing networks", "err", err)
nbrp.Status.Conditions = netbirdiov1.NBConditionFalse("APIError", fmt.Sprintf("error listing networks: %v", err))
nbrp.Status.Conditions = nbv1.NBConditionFalse("APIError", fmt.Sprintf("error listing networks: %v", err))
return err
}
var network *api.Network
@@ -539,7 +540,7 @@ func (r *NBRoutingPeerReconciler) handleNetwork(ctx context.Context, req ctrl.Re
})
if err != nil {
logger.Error(errNetBirdAPI, "error creating network", "err", err)
nbrp.Status.Conditions = netbirdiov1.NBConditionFalse("APIError", fmt.Sprintf("error creating network: %v", err))
nbrp.Status.Conditions = nbv1.NBConditionFalse("APIError", fmt.Sprintf("error creating network: %v", err))
return err
}
@@ -549,7 +550,7 @@ func (r *NBRoutingPeerReconciler) handleNetwork(ctx context.Context, req ctrl.Re
return nil
}
func (r *NBRoutingPeerReconciler) handleDelete(ctx context.Context, req ctrl.Request, nbrp *netbirdiov1.NBRoutingPeer, logger logr.Logger) (ctrl.Result, error) {
func (r *NBRoutingPeerReconciler) handleDelete(ctx context.Context, req ctrl.Request, nbrp *nbv1.NBRoutingPeer, logger logr.Logger) (ctrl.Result, error) {
nbDeployment := appsv1.Deployment{}
err := r.Client.Get(ctx, req.NamespacedName, &nbDeployment)
if err != nil && !errors.IsNotFound(err) {
@@ -577,7 +578,7 @@ func (r *NBRoutingPeerReconciler) handleDelete(ctx context.Context, req ctrl.Req
logger.Info("Setup key deleted", "id", setupKeyID)
}
nbGroup := netbirdiov1.NBGroup{}
nbGroup := nbv1.NBGroup{}
err = r.Client.Get(ctx, req.NamespacedName, &nbGroup)
if err != nil && !errors.IsNotFound(err) {
logger.Error(errKubernetesAPI, "error getting NBGroup", "err", err)
@@ -585,7 +586,7 @@ func (r *NBRoutingPeerReconciler) handleDelete(ctx context.Context, req ctrl.Req
}
if nbrp.Status.NetworkID != nil {
nbResourceList := netbirdiov1.NBResourceList{}
nbResourceList := nbv1.NBResourceList{}
err = r.Client.List(ctx, &nbResourceList)
if err != nil {
logger.Error(errKubernetesAPI, "error listing NBResource", "err", err)
@@ -644,7 +645,7 @@ func (r *NBRoutingPeerReconciler) handleDelete(ctx context.Context, req ctrl.Req
}
// buildSecurityContext creates the appropriate SecurityContext based on the NBRoutingPeer spec
func (r *NBRoutingPeerReconciler) buildSecurityContext(nbrp *netbirdiov1.NBRoutingPeer) *corev1.SecurityContext {
func (r *NBRoutingPeerReconciler) buildSecurityContext(nbrp *nbv1.NBRoutingPeer) *corev1.SecurityContext {
securityContext := &corev1.SecurityContext{
Capabilities: &corev1.Capabilities{
Add: []corev1.Capability{
@@ -664,10 +665,10 @@ func (r *NBRoutingPeerReconciler) buildSecurityContext(nbrp *netbirdiov1.NBRouti
// SetupWithManager sets up the controller with the Manager.
func (r *NBRoutingPeerReconciler) SetupWithManager(mgr ctrl.Manager) error {
return ctrl.NewControllerManagedBy(mgr).
For(&netbirdiov1.NBRoutingPeer{}).
For(&nbv1.NBRoutingPeer{}).
Named("nbroutingpeer").
Watches(&appsv1.Deployment{}, handler.EnqueueRequestForOwner(mgr.GetScheme(), mgr.GetRESTMapper(), &netbirdiov1.NBRoutingPeer{})).
Watches(&corev1.Secret{}, handler.EnqueueRequestForOwner(mgr.GetScheme(), mgr.GetRESTMapper(), &netbirdiov1.NBRoutingPeer{})).
Watches(&netbirdiov1.NBGroup{}, handler.EnqueueRequestForOwner(mgr.GetScheme(), mgr.GetRESTMapper(), &netbirdiov1.NBRoutingPeer{})).
Watches(&appsv1.Deployment{}, handler.EnqueueRequestForOwner(mgr.GetScheme(), mgr.GetRESTMapper(), &nbv1.NBRoutingPeer{})).
Watches(&corev1.Secret{}, handler.EnqueueRequestForOwner(mgr.GetScheme(), mgr.GetRESTMapper(), &nbv1.NBRoutingPeer{})).
Watches(&nbv1.NBGroup{}, handler.EnqueueRequestForOwner(mgr.GetScheme(), mgr.GetRESTMapper(), &nbv1.NBRoutingPeer{})).
Complete(r)
}
@@ -10,19 +10,19 @@ import (
"github.com/go-logr/logr"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/reconcile"
appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
netbirdiov1 "github.com/netbirdio/kubernetes-operator/api/v1"
"github.com/netbirdio/kubernetes-operator/internal/util"
netbird "github.com/netbirdio/netbird/shared/management/client/rest"
"github.com/netbirdio/netbird/shared/management/http/api"
nbv1 "github.com/netbirdio/kubernetes-operator/api/v1"
"github.com/netbirdio/kubernetes-operator/internal/util"
)
var _ = Describe("NBRoutingPeer Controller", func() {
@@ -35,7 +35,7 @@ var _ = Describe("NBRoutingPeer Controller", func() {
Name: resourceName,
Namespace: "default",
}
nbroutingpeer := &netbirdiov1.NBRoutingPeer{}
nbroutingpeer := &nbv1.NBRoutingPeer{}
var netbirdClient *netbird.Client
var mux *http.ServeMux
var server *httptest.Server
@@ -58,13 +58,13 @@ var _ = Describe("NBRoutingPeer Controller", func() {
By("creating the custom resource for the Kind NBRoutingPeer")
err := k8sClient.Get(ctx, typeNamespacedName, nbroutingpeer)
if err != nil && errors.IsNotFound(err) {
nbroutingpeer = &netbirdiov1.NBRoutingPeer{
nbroutingpeer = &nbv1.NBRoutingPeer{
ObjectMeta: metav1.ObjectMeta{
Name: resourceName,
Namespace: "default",
Finalizers: []string{"netbird.io/cleanup"},
},
Spec: netbirdiov1.NBRoutingPeerSpec{
Spec: nbv1.NBRoutingPeerSpec{
Replicas: util.Ptr(int32(0)),
},
}
@@ -73,7 +73,7 @@ var _ = Describe("NBRoutingPeer Controller", func() {
})
AfterEach(func() {
resource := &netbirdiov1.NBRoutingPeer{}
resource := &nbv1.NBRoutingPeer{}
err := k8sClient.Get(ctx, typeNamespacedName, resource)
if !errors.IsNotFound(err) {
Expect(err).NotTo(HaveOccurred())
@@ -89,7 +89,7 @@ var _ = Describe("NBRoutingPeer Controller", func() {
}
}
group := &netbirdiov1.NBGroup{}
group := &nbv1.NBGroup{}
err = k8sClient.Get(ctx, typeNamespacedName, group)
if !errors.IsNotFound(err) {
Expect(err).NotTo(HaveOccurred())
@@ -137,7 +137,7 @@ var _ = Describe("NBRoutingPeer Controller", func() {
}
}
nbresource := &netbirdiov1.NBResource{}
nbresource := &nbv1.NBResource{}
err = k8sClient.Get(ctx, typeNamespacedName, nbresource)
if !errors.IsNotFound(err) {
Expect(err).NotTo(HaveOccurred())
@@ -156,12 +156,12 @@ var _ = Describe("NBRoutingPeer Controller", func() {
When("Network doesn't exist", func() {
BeforeEach(func() {
group := &netbirdiov1.NBGroup{
group := &nbv1.NBGroup{
ObjectMeta: metav1.ObjectMeta{
Name: typeNamespacedName.Name,
Namespace: typeNamespacedName.Namespace,
},
Spec: netbirdiov1.NBGroupSpec{
Spec: nbv1.NBGroupSpec{
Name: controllerReconciler.ClusterName,
},
}
@@ -230,12 +230,12 @@ var _ = Describe("NBRoutingPeer Controller", func() {
})
Describe("Network Router changes", func() {
BeforeEach(func() {
group := &netbirdiov1.NBGroup{
group := &nbv1.NBGroup{
ObjectMeta: metav1.ObjectMeta{
Name: typeNamespacedName.Name,
Namespace: typeNamespacedName.Namespace,
},
Spec: netbirdiov1.NBGroupSpec{
Spec: nbv1.NBGroupSpec{
Name: controllerReconciler.ClusterName,
},
}
@@ -445,7 +445,7 @@ var _ = Describe("NBRoutingPeer Controller", func() {
Expect(err).NotTo(HaveOccurred())
Expect(res.RequeueAfter).To(BeNumerically(">", 0))
group := &netbirdiov1.NBGroup{}
group := &nbv1.NBGroup{}
Expect(k8sClient.Get(ctx, typeNamespacedName, group)).To(Succeed())
Expect(group.Spec.Name).To(Equal(controllerReconciler.ClusterName))
Expect(group.Labels).To(HaveKeyWithValue("dog", "bark"))
@@ -461,13 +461,13 @@ var _ = Describe("NBRoutingPeer Controller", func() {
})
When("Group exists", func() {
BeforeEach(func() {
group := &netbirdiov1.NBGroup{
group := &nbv1.NBGroup{
ObjectMeta: metav1.ObjectMeta{
Name: typeNamespacedName.Name,
Namespace: typeNamespacedName.Namespace,
Finalizers: []string{"netbird.io/routing-peer-cleanup", "netbird.io/group-cleanup"},
},
Spec: netbirdiov1.NBGroupSpec{
Spec: nbv1.NBGroupSpec{
Name: controllerReconciler.ClusterName,
},
}
@@ -1102,7 +1102,7 @@ var _ = Describe("NBRoutingPeer Controller", func() {
NamespacedName: typeNamespacedName,
})
Expect(err).NotTo(HaveOccurred())
group := &netbirdiov1.NBGroup{}
group := &nbv1.NBGroup{}
Expect(k8sClient.Get(ctx, typeNamespacedName, group)).To(Succeed())
Expect(group.Finalizers).NotTo(ContainElement("netbird.io/routing-peer-cleanup"))
})
@@ -1137,12 +1137,12 @@ var _ = Describe("NBRoutingPeer Controller", func() {
})
It("should delete any hanging NBResources", func() {
nbResource := &netbirdiov1.NBResource{
nbResource := &nbv1.NBResource{
ObjectMeta: metav1.ObjectMeta{
Name: typeNamespacedName.Name,
Namespace: typeNamespacedName.Namespace,
},
Spec: netbirdiov1.NBResourceSpec{
Spec: nbv1.NBResourceSpec{
Name: "test",
NetworkID: *nbroutingpeer.Status.NetworkID,
Address: "test",
@@ -1155,7 +1155,7 @@ var _ = Describe("NBRoutingPeer Controller", func() {
NamespacedName: typeNamespacedName,
})
Expect(err).NotTo(HaveOccurred())
nbResource = &netbirdiov1.NBResource{}
nbResource = &nbv1.NBResource{}
err = k8sClient.Get(ctx, typeNamespacedName, nbResource)
Expect(errors.IsNotFound(err)).To(BeTrue())
})
+21 -21
View File
@@ -23,14 +23,14 @@ import (
"github.com/google/uuid"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/errors"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/handler"
"sigs.k8s.io/controller-runtime/pkg/reconcile"
netbirdiov1 "github.com/netbirdio/kubernetes-operator/api/v1"
nbv1 "github.com/netbirdio/kubernetes-operator/api/v1"
)
// NBSetupKeyReconciler reconciles a NBSetupKey object
@@ -46,7 +46,7 @@ func (r *NBSetupKeyReconciler) Reconcile(ctx context.Context, req ctrl.Request)
logger := ctrl.Log.WithName("NBSetupKey").WithValues("namespace", req.Namespace, "name", req.Name)
logger.Info("Reconciling NBSetupKey")
nbSetupKey := netbirdiov1.NBSetupKey{}
nbSetupKey := nbv1.NBSetupKey{}
err := r.Get(ctx, req.NamespacedName, &nbSetupKey)
if err != nil {
logger.Error(fmt.Errorf("internalError"), "error getting NBSetupKey", "err", err)
@@ -55,12 +55,12 @@ func (r *NBSetupKeyReconciler) Reconcile(ctx context.Context, req ctrl.Request)
if nbSetupKey.Spec.SecretKeyRef.Name == "" || nbSetupKey.Spec.SecretKeyRef.Key == "" {
logger.Error(fmt.Errorf("invalid NBSetupKey"), "secretKeyRef must contain both secret name and secret key")
return ctrl.Result{}, r.setStatus(ctx, &nbSetupKey, netbirdiov1.NBSetupKeyStatus{
Conditions: []netbirdiov1.NBCondition{
return ctrl.Result{}, r.setStatus(ctx, &nbSetupKey, nbv1.NBSetupKeyStatus{
Conditions: []nbv1.NBCondition{
{
Type: netbirdiov1.NBSetupKeyReady,
Type: nbv1.NBSetupKeyReady,
Status: corev1.ConditionFalse,
LastProbeTime: v1.Now(),
LastProbeTime: metav1.Now(),
Reason: "InvalidConfig",
Message: "secretKeyRef must contain both secret name and secret key.",
},
@@ -85,10 +85,10 @@ func (r *NBSetupKeyReconciler) Reconcile(ctx context.Context, req ctrl.Request)
return ctrl.Result{}, err
}
logger.Error(fmt.Errorf("invalid NBSetupKey"), "secret referenced not found", "err", err)
return ctrl.Result{}, r.setStatus(ctx, &nbSetupKey, netbirdiov1.NBSetupKeyStatus{Conditions: []netbirdiov1.NBCondition{{
Type: netbirdiov1.NBSetupKeyReady,
return ctrl.Result{}, r.setStatus(ctx, &nbSetupKey, nbv1.NBSetupKeyStatus{Conditions: []nbv1.NBCondition{{
Type: nbv1.NBSetupKeyReady,
Status: corev1.ConditionFalse,
LastProbeTime: v1.Now(),
LastProbeTime: metav1.Now(),
Reason: "SecretNotExists",
Message: "Referenced secret does not exist",
}}})
@@ -97,10 +97,10 @@ func (r *NBSetupKeyReconciler) Reconcile(ctx context.Context, req ctrl.Request)
uuidBytes, ok := secret.Data[nbSetupKey.Spec.SecretKeyRef.Key]
if !ok {
logger.Error(fmt.Errorf("invalid NBSetupKey"), "secret key referenced not found")
return ctrl.Result{}, r.setStatus(ctx, &nbSetupKey, netbirdiov1.NBSetupKeyStatus{Conditions: []netbirdiov1.NBCondition{{
Type: netbirdiov1.NBSetupKeyReady,
return ctrl.Result{}, r.setStatus(ctx, &nbSetupKey, nbv1.NBSetupKeyStatus{Conditions: []nbv1.NBCondition{{
Type: nbv1.NBSetupKeyReady,
Status: corev1.ConditionFalse,
LastProbeTime: v1.Now(),
LastProbeTime: metav1.Now(),
Reason: "SecretKeyNotExists",
Message: "Referenced secret key does not exist",
}}})
@@ -109,22 +109,22 @@ func (r *NBSetupKeyReconciler) Reconcile(ctx context.Context, req ctrl.Request)
_, err = uuid.Parse(string(uuidBytes))
if err != nil {
logger.Error(fmt.Errorf("invalid NBSetupKey"), "setupKey is not a valid UUID", "err", err)
return ctrl.Result{}, r.setStatus(ctx, &nbSetupKey, netbirdiov1.NBSetupKeyStatus{Conditions: []netbirdiov1.NBCondition{{
Type: netbirdiov1.NBSetupKeyReady,
return ctrl.Result{}, r.setStatus(ctx, &nbSetupKey, nbv1.NBSetupKeyStatus{Conditions: []nbv1.NBCondition{{
Type: nbv1.NBSetupKeyReady,
Status: corev1.ConditionFalse,
LastProbeTime: v1.Now(),
LastProbeTime: metav1.Now(),
Reason: "InvalidSetupKey",
Message: "Referenced secret is not a valid SetupKey",
}}})
}
return ctrl.Result{}, r.setStatus(ctx, &nbSetupKey, netbirdiov1.NBSetupKeyStatus{Conditions: []netbirdiov1.NBCondition{{
Type: netbirdiov1.NBSetupKeyReady,
return ctrl.Result{}, r.setStatus(ctx, &nbSetupKey, nbv1.NBSetupKeyStatus{Conditions: []nbv1.NBCondition{{
Type: nbv1.NBSetupKeyReady,
Status: corev1.ConditionTrue,
LastProbeTime: v1.Now(),
LastProbeTime: metav1.Now(),
}}})
}
func (r *NBSetupKeyReconciler) setStatus(ctx context.Context, nbsetupkey *netbirdiov1.NBSetupKey, status netbirdiov1.NBSetupKeyStatus) error {
func (r *NBSetupKeyReconciler) setStatus(ctx context.Context, nbsetupkey *nbv1.NBSetupKey, status nbv1.NBSetupKeyStatus) error {
nbsetupkey.Status = status
err := r.Status().Update(ctx, nbsetupkey)
return err
@@ -135,7 +135,7 @@ func (r *NBSetupKeyReconciler) SetupWithManager(mgr ctrl.Manager) error {
r.ReferencedSecrets = make(map[string]types.NamespacedName)
return ctrl.NewControllerManagedBy(mgr).
For(&netbirdiov1.NBSetupKey{}).
For(&nbv1.NBSetupKey{}).
Named("nbsetupkey").
Watches(
&corev1.Secret{},
@@ -21,13 +21,12 @@ import (
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
v1 "k8s.io/api/core/v1"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types"
"sigs.k8s.io/controller-runtime/pkg/reconcile"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
netbirdiov1 "github.com/netbirdio/kubernetes-operator/api/v1"
nbv1 "github.com/netbirdio/kubernetes-operator/api/v1"
)
var _ = Describe("NBSetupKey Controller", func() {
@@ -40,20 +39,20 @@ var _ = Describe("NBSetupKey Controller", func() {
Name: resourceName,
Namespace: "default",
}
nbsetupkey := &netbirdiov1.NBSetupKey{}
secret := &v1.Secret{}
nbsetupkey := &nbv1.NBSetupKey{}
secret := &corev1.Secret{}
BeforeEach(func() {
By("creating the custom resource for the Kind NBSetupKey")
err := k8sClient.Get(ctx, typeNamespacedName, nbsetupkey)
resource := &netbirdiov1.NBSetupKey{
resource := &nbv1.NBSetupKey{
ObjectMeta: metav1.ObjectMeta{
Name: resourceName,
Namespace: "default",
},
Spec: netbirdiov1.NBSetupKeySpec{
SecretKeyRef: v1.SecretKeySelector{
LocalObjectReference: v1.LocalObjectReference{
Spec: nbv1.NBSetupKeySpec{
SecretKeyRef: corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
Name: resourceName,
},
Key: "setupkey",
@@ -67,7 +66,7 @@ var _ = Describe("NBSetupKey Controller", func() {
})
AfterEach(func() {
resource := &netbirdiov1.NBSetupKey{}
resource := &nbv1.NBSetupKey{}
err := k8sClient.Get(ctx, typeNamespacedName, resource)
Expect(err).NotTo(HaveOccurred())
@@ -92,7 +91,7 @@ var _ = Describe("NBSetupKey Controller", func() {
Expect(nbsetupkey.Status.Conditions).NotTo(BeNil())
Expect(nbsetupkey.Status.Conditions).To(HaveLen(1))
Expect(nbsetupkey.Status.Conditions[0].Status).To(Equal(v1.ConditionFalse))
Expect(nbsetupkey.Status.Conditions[0].Status).To(Equal(corev1.ConditionFalse))
Expect(nbsetupkey.Status.Conditions[0].Reason).To(Equal("SecretNotExists"))
Expect(controllerReconciler.ReferencedSecrets).To(HaveKey("default/test-resource"))
})
@@ -100,7 +99,7 @@ var _ = Describe("NBSetupKey Controller", func() {
When("Secret present", Ordered, func() {
createSecret := func(secretkey, setupkey string) {
resource := &v1.Secret{
resource := &corev1.Secret{
ObjectMeta: metav1.ObjectMeta{
Namespace: "default",
Name: resourceName,
@@ -110,7 +109,7 @@ var _ = Describe("NBSetupKey Controller", func() {
},
}
secret = &v1.Secret{}
secret = &corev1.Secret{}
err := k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: resourceName}, secret)
if err == nil {
Expect(k8sClient.Delete(ctx, secret)).To(Succeed())
@@ -137,7 +136,7 @@ var _ = Describe("NBSetupKey Controller", func() {
Expect(nbsetupkey.Status.Conditions).NotTo(BeNil())
Expect(nbsetupkey.Status.Conditions).To(HaveLen(1))
Expect(nbsetupkey.Status.Conditions[0].Status).To(Equal(v1.ConditionFalse))
Expect(nbsetupkey.Status.Conditions[0].Status).To(Equal(corev1.ConditionFalse))
Expect(nbsetupkey.Status.Conditions[0].Reason).To(Equal("InvalidSetupKey"))
Expect(controllerReconciler.ReferencedSecrets).To(HaveKey("default/test-resource"))
})
@@ -162,7 +161,7 @@ var _ = Describe("NBSetupKey Controller", func() {
Expect(nbsetupkey.Status.Conditions).NotTo(BeNil())
Expect(nbsetupkey.Status.Conditions).To(HaveLen(1))
Expect(nbsetupkey.Status.Conditions[0].Status).To(Equal(v1.ConditionFalse))
Expect(nbsetupkey.Status.Conditions[0].Status).To(Equal(corev1.ConditionFalse))
Expect(nbsetupkey.Status.Conditions[0].Reason).To(Equal("SecretKeyNotExists"))
Expect(controllerReconciler.ReferencedSecrets).To(HaveKey("default/test-resource"))
})
@@ -187,7 +186,7 @@ var _ = Describe("NBSetupKey Controller", func() {
Expect(nbsetupkey.Status.Conditions).NotTo(BeNil())
Expect(nbsetupkey.Status.Conditions).To(HaveLen(1))
Expect(nbsetupkey.Status.Conditions[0].Status).To(Equal(v1.ConditionTrue))
Expect(nbsetupkey.Status.Conditions[0].Status).To(Equal(corev1.ConditionTrue))
Expect(controllerReconciler.ReferencedSecrets).To(HaveKey("default/test-resource"))
})
})

Some files were not shown because too many files have changed in this diff Show More