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" version: "2"
run:
allow-parallel-runners: true
linters: linters:
default: none default: none
enable: enable:
@@ -21,12 +19,65 @@ linters:
- unconvert - unconvert
- unparam - unparam
- unused - unused
- importas
settings: settings:
revive: revive:
rules: rules:
- name: comment-spacings - name: comment-spacings
staticcheck: staticcheck:
checks: ["all", "-ST1000", "-ST1003", "-ST1016", "-ST1020", "-ST1021", "-ST1022", "-QF1008", "-SA1019"] 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: exclusions:
generated: lax generated: lax
rules: rules:
@@ -43,11 +94,18 @@ linters:
- examples$ - examples$
formatters: formatters:
enable: enable:
- gci
- gofmt - gofmt
- goimports settings:
exclusions: gci:
generated: lax sections:
paths: - blank
- third_party$ - standard
- builtin$ - prefix(golang.org/x)
- examples$ - 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 package v1
import ( import (
"github.com/netbirdio/kubernetes-operator/internal/util"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/netbirdio/kubernetes-operator/internal/util"
) )
// NBGroupSpec defines the desired state of NBGroup. // NBGroupSpec defines the desired state of NBGroup.
+2 -1
View File
@@ -1,8 +1,9 @@
package v1 package v1
import ( import (
"github.com/netbirdio/kubernetes-operator/internal/util"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/netbirdio/kubernetes-operator/internal/util"
) )
// NBPolicySpec defines the desired state of NBPolicy. // NBPolicySpec defines the desired state of NBPolicy.
+2 -1
View File
@@ -3,8 +3,9 @@ package v1
import ( import (
"maps" "maps"
"github.com/netbirdio/kubernetes-operator/internal/util"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/netbirdio/kubernetes-operator/internal/util"
) )
// NBResourceSpec defines the desired state of NBResource. // NBResourceSpec defines the desired state of NBResource.
+2 -1
View File
@@ -1,9 +1,10 @@
package v1 package v1
import ( import (
"github.com/netbirdio/kubernetes-operator/internal/util"
corev1 "k8s.io/api/core/v1" corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/netbirdio/kubernetes-operator/internal/util"
) )
// NBRoutingPeerSpec defines the desired state of NBRoutingPeer. // NBRoutingPeerSpec defines the desired state of NBRoutingPeer.
+17 -17
View File
@@ -17,6 +17,10 @@ limitations under the License.
package main package main
import ( 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" "crypto/tls"
"errors" "errors"
"flag" "flag"
@@ -25,11 +29,6 @@ import (
"path/filepath" "path/filepath"
"strings" "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" corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
utilruntime "k8s.io/apimachinery/pkg/util/runtime" utilruntime "k8s.io/apimachinery/pkg/util/runtime"
@@ -41,14 +40,15 @@ import (
"sigs.k8s.io/controller-runtime/pkg/log/zap" "sigs.k8s.io/controller-runtime/pkg/log/zap"
metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server" metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server"
"sigs.k8s.io/controller-runtime/pkg/webhook" "sigs.k8s.io/controller-runtime/pkg/webhook"
gatewayv1 "sigs.k8s.io/gateway-api/apis/v1" gwv1 "sigs.k8s.io/gateway-api/apis/v1"
gatewayv1alpha2 "sigs.k8s.io/gateway-api/apis/v1alpha2" gwv1alpha2 "sigs.k8s.io/gateway-api/apis/v1alpha2"
netbirdiov1 "github.com/netbirdio/kubernetes-operator/api/v1" netbird "github.com/netbirdio/netbird/shared/management/client/rest"
netbirdiov1alpha1 "github.com/netbirdio/kubernetes-operator/api/v1alpha1"
nbv1 "github.com/netbirdio/kubernetes-operator/api/v1"
nbv1alpha1 "github.com/netbirdio/kubernetes-operator/api/v1alpha1"
"github.com/netbirdio/kubernetes-operator/internal/controller" "github.com/netbirdio/kubernetes-operator/internal/controller"
webhooknetbirdiov1 "github.com/netbirdio/kubernetes-operator/internal/webhook/v1" nbwebhookv1 "github.com/netbirdio/kubernetes-operator/internal/webhook/v1"
// +kubebuilder:scaffold:imports
) )
var ( var (
@@ -59,11 +59,11 @@ var (
func init() { func init() {
utilruntime.Must(clientgoscheme.AddToScheme(scheme)) utilruntime.Must(clientgoscheme.AddToScheme(scheme))
utilruntime.Must(netbirdiov1.AddToScheme(scheme)) utilruntime.Must(nbv1.AddToScheme(scheme))
utilruntime.Must(corev1.AddToScheme(scheme)) utilruntime.Must(corev1.AddToScheme(scheme))
utilruntime.Must(gatewayv1.Install(scheme)) utilruntime.Must(gwv1.Install(scheme))
utilruntime.Must(gatewayv1alpha2.Install(scheme)) utilruntime.Must(gwv1alpha2.Install(scheme))
utilruntime.Must(netbirdiov1alpha1.AddToScheme(scheme)) utilruntime.Must(nbv1alpha1.AddToScheme(scheme))
// +kubebuilder:scaffold:scheme // +kubebuilder:scaffold:scheme
} }
@@ -215,7 +215,7 @@ func main() {
} }
if enableWebhooks { 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") setupLog.Error(err, "unable to create webhook", "webhook", "Pod")
os.Exit(1) os.Exit(1)
} }
@@ -281,7 +281,7 @@ func main() {
} }
if enableWebhooks { 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") setupLog.Error(err, "unable to create webhook", "webhook", "NBGroup")
os.Exit(1) os.Exit(1)
} }
+15 -15
View File
@@ -29,7 +29,7 @@ import (
ctrl "sigs.k8s.io/controller-runtime" ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" "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" nbv1alpha1 "github.com/netbirdio/kubernetes-operator/api/v1alpha1"
"github.com/netbirdio/kubernetes-operator/internal/gatewayutil" "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) { 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) err := r.Get(ctx, req.NamespacedName, gw)
if err != nil { if err != nil {
return ctrl.Result{}, client.IgnoreNotFound(err) 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) sp := patch.NewSerialPatcher(gw, r.Client)
// Check if referenced class belongs to this controller. // Check if referenced class belongs to this controller.
gwc := &gatewayv1.GatewayClass{} gwc := &gwv1.GatewayClass{}
nn := types.NamespacedName{ nn := types.NamespacedName{
Name: string(gw.Spec.GatewayClassName), 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 { if string(gwc.Spec.ControllerName) != GatewayControllerName {
return ctrl.Result{}, nil 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 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) routingPeerName, err := gatewayutil.GetNetworkRouterName(gw.Spec.Listeners)
if err != nil { if err != nil {
cond := metav1.Condition{ cond := metav1.Condition{
Type: string(gatewayv1.GatewayConditionAccepted), Type: string(gwv1.GatewayConditionAccepted),
Status: metav1.ConditionFalse, Status: metav1.ConditionFalse,
Reason: string(gatewayv1.GatewayReasonInvalidParameters), Reason: string(gwv1.GatewayReasonInvalidParameters),
Message: err.Error(), Message: err.Error(),
} }
meta.SetStatusCondition(&gw.Status.Conditions, cond) 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 return ctrl.Result{}, nil
} }
cond := metav1.Condition{ cond := metav1.Condition{
Type: string(gatewayv1.GatewayConditionAccepted), Type: string(gwv1.GatewayConditionAccepted),
Status: metav1.ConditionTrue, Status: metav1.ConditionTrue,
Reason: string(gatewayv1.GatewayReasonAccepted), Reason: string(gwv1.GatewayReasonAccepted),
} }
meta.SetStatusCondition(&gw.Status.Conditions, cond) meta.SetStatusCondition(&gw.Status.Conditions, cond)
controllerutil.AddFinalizer(gw, k8sutil.Finalizer("gateway")) 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) { if !conditions.Has(netRouter, nbv1alpha1.ReadyCondition) {
// TODO (phillebaba): Should watch routing peer instead of retrying when not found. // TODO (phillebaba): Should watch routing peer instead of retrying when not found.
cond := metav1.Condition{ cond := metav1.Condition{
Type: string(gatewayv1.GatewayConditionProgrammed), Type: string(gwv1.GatewayConditionProgrammed),
Status: metav1.ConditionFalse, Status: metav1.ConditionFalse,
Reason: string(gatewayv1.GatewayReasonProgrammed), Reason: string(gwv1.GatewayReasonProgrammed),
Message: fmt.Sprintf("NBRoutingPeer %s is not ready", routingPeerName), Message: fmt.Sprintf("NBRoutingPeer %s is not ready", routingPeerName),
} }
meta.SetStatusCondition(&gw.Status.Conditions, cond) 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. // Signal Gateway is programmed.
cond = metav1.Condition{ cond = metav1.Condition{
Type: string(gatewayv1.GatewayConditionProgrammed), Type: string(gwv1.GatewayConditionProgrammed),
Status: metav1.ConditionTrue, Status: metav1.ConditionTrue,
Reason: string(gatewayv1.GatewayReasonProgrammed), Reason: string(gwv1.GatewayReasonProgrammed),
} }
meta.SetStatusCondition(&gw.Status.Conditions, cond) meta.SetStatusCondition(&gw.Status.Conditions, cond)
err = sp.Patch(ctx, gw) err = sp.Patch(ctx, gw)
@@ -132,8 +132,8 @@ func (r *GatewayReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
return ctrl.Result{}, nil return ctrl.Result{}, nil
} }
func (r *GatewayReconciler) reconcileDelete(ctx context.Context, sp *patch.SerialPatcher, gw *gatewayv1.Gateway) (ctrl.Result, error) { func (r *GatewayReconciler) reconcileDelete(ctx context.Context, sp *patch.SerialPatcher, gw *gwv1.Gateway) (ctrl.Result, error) {
var httpRouteList gatewayv1.HTTPRouteList var httpRouteList gwv1.HTTPRouteList
err := r.Client.List(ctx, &httpRouteList) err := r.Client.List(ctx, &httpRouteList)
if err != nil { if err != nil {
return ctrl.Result{}, err 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 { func (r *GatewayReconciler) SetupWithManager(mgr ctrl.Manager) error {
return ctrl.NewControllerManagedBy(mgr). return ctrl.NewControllerManagedBy(mgr).
For(&gatewayv1.Gateway{}). For(&gwv1.Gateway{}).
Complete(r) Complete(r)
} }
+11 -10
View File
@@ -5,13 +5,14 @@ import (
"time" "time"
"github.com/fluxcd/pkg/runtime/patch" "github.com/fluxcd/pkg/runtime/patch"
"github.com/netbirdio/kubernetes-operator/internal/k8sutil"
"k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/api/meta"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
ctrl "sigs.k8s.io/controller-runtime" ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" "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 ( const (
@@ -23,7 +24,7 @@ type GatewayClassReconciler struct {
} }
func (r *GatewayClassReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { 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) err := r.Client.Get(ctx, req.NamespacedName, gwc)
if err != nil { if err != nil {
return ctrl.Result{}, client.IgnoreNotFound(err) return ctrl.Result{}, client.IgnoreNotFound(err)
@@ -52,9 +53,9 @@ func (r *GatewayClassReconciler) Reconcile(ctx context.Context, req ctrl.Request
}() }()
if message != "" { if message != "" {
cond := metav1.Condition{ cond := metav1.Condition{
Type: string(gatewayv1.GatewayClassConditionStatusAccepted), Type: string(gwv1.GatewayClassConditionStatusAccepted),
Status: metav1.ConditionFalse, Status: metav1.ConditionFalse,
Reason: string(gatewayv1.GatewayClassReasonInvalidParameters), Reason: string(gwv1.GatewayClassReasonInvalidParameters),
Message: message, Message: message,
} }
meta.SetStatusCondition(&gwc.Status.Conditions, cond) meta.SetStatusCondition(&gwc.Status.Conditions, cond)
@@ -68,9 +69,9 @@ func (r *GatewayClassReconciler) Reconcile(ctx context.Context, req ctrl.Request
// Set condition to accepted. // Set condition to accepted.
controllerutil.AddFinalizer(gwc, k8sutil.Finalizer("gatewayclass")) controllerutil.AddFinalizer(gwc, k8sutil.Finalizer("gatewayclass"))
cond := metav1.Condition{ cond := metav1.Condition{
Type: string(gatewayv1.GatewayClassConditionStatusAccepted), Type: string(gwv1.GatewayClassConditionStatusAccepted),
Status: metav1.ConditionTrue, Status: metav1.ConditionTrue,
Reason: string(gatewayv1.GatewayClassReasonAccepted), Reason: string(gwv1.GatewayClassReasonAccepted),
Message: "Reconciled by Netbird Operator.", Message: "Reconciled by Netbird Operator.",
} }
meta.SetStatusCondition(&gwc.Status.Conditions, cond) meta.SetStatusCondition(&gwc.Status.Conditions, cond)
@@ -81,8 +82,8 @@ func (r *GatewayClassReconciler) Reconcile(ctx context.Context, req ctrl.Request
return ctrl.Result{}, nil return ctrl.Result{}, nil
} }
func (r *GatewayClassReconciler) reconcileDelete(ctx context.Context, sp *patch.SerialPatcher, gwc *gatewayv1.GatewayClass) (ctrl.Result, error) { func (r *GatewayClassReconciler) reconcileDelete(ctx context.Context, sp *patch.SerialPatcher, gwc *gwv1.GatewayClass) (ctrl.Result, error) {
var gatewayList gatewayv1.GatewayList var gatewayList gwv1.GatewayList
err := r.Client.List(ctx, &gatewayList) err := r.Client.List(ctx, &gatewayList)
if err != nil { if err != nil {
return ctrl.Result{}, err 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. // SetupWithManager sets up the controller with the Manager.
func (r *GatewayClassReconciler) SetupWithManager(mgr ctrl.Manager) error { func (r *GatewayClassReconciler) SetupWithManager(mgr ctrl.Manager) error {
return ctrl.NewControllerManagedBy(mgr). return ctrl.NewControllerManagedBy(mgr).
For(&gatewayv1.GatewayClass{}). For(&gwv1.GatewayClass{}).
Complete(r) Complete(r)
} }
+3 -2
View File
@@ -5,12 +5,13 @@ import (
"github.com/fluxcd/pkg/runtime/conditions" "github.com/fluxcd/pkg/runtime/conditions"
"github.com/fluxcd/pkg/runtime/patch" "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" ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" "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" nbv1alpha1 "github.com/netbirdio/kubernetes-operator/api/v1alpha1"
"github.com/netbirdio/kubernetes-operator/internal/k8sutil" "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/conditions"
"github.com/fluxcd/pkg/runtime/patch" "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" corev1 "k8s.io/api/core/v1"
kerrors "k8s.io/apimachinery/pkg/api/errors" kerrors "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/api/meta"
@@ -15,7 +13,10 @@ import (
ctrl "sigs.k8s.io/controller-runtime" ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" "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" nbv1alpha1 "github.com/netbirdio/kubernetes-operator/api/v1alpha1"
"github.com/netbirdio/kubernetes-operator/internal/gatewayutil" "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) { 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) 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) err := r.Get(ctx, req.NamespacedName, hr)
if err != nil { if err != nil {
return ctrl.Result{}, client.IgnoreNotFound(err) return ctrl.Result{}, client.IgnoreNotFound(err)
@@ -57,7 +58,7 @@ func (r *HTTPRouteReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
if gw == nil { if gw == nil {
continue 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) logger.Info("gateway is not ready", "name", gw.ObjectMeta.Name)
continue continue
} }
@@ -176,7 +177,7 @@ func (r *HTTPRouteReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
return ctrl.Result{}, nil 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. // Index all proxy services.
proxyServices, err := r.Netbird.ReverseProxyServices.List(ctx) proxyServices, err := r.Netbird.ReverseProxyServices.List(ctx)
if err != nil { 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. // SetupWithManager sets up the controller with the Manager.
func (r *HTTPRouteReconciler) SetupWithManager(mgr ctrl.Manager) error { func (r *HTTPRouteReconciler) SetupWithManager(mgr ctrl.Manager) error {
return ctrl.NewControllerManagedBy(mgr). return ctrl.NewControllerManagedBy(mgr).
For(&gatewayv1.HTTPRoute{}). For(&gwv1.HTTPRoute{}).
Complete(r) Complete(r)
} }
+15 -14
View File
@@ -7,13 +7,14 @@ import (
"time" "time"
"github.com/go-logr/logr" "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/api/errors"
ctrl "sigs.k8s.io/controller-runtime" ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client" "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" "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 := ctrl.Log.WithName("NBGroup").WithValues("namespace", req.Namespace, "name", req.Name)
logger.Info("Reconciling NBGroup") logger.Info("Reconciling NBGroup")
nbGroup := netbirdiov1.NBGroup{} nbGroup := nbv1.NBGroup{}
err = r.Client.Get(ctx, req.NamespacedName, &nbGroup) err = r.Client.Get(ctx, req.NamespacedName, &nbGroup)
if err != nil { if err != nil {
if !errors.IsNotFound(err) { 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. // 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 // Get all NetBird groups to ensure no group duplication
groups, err := r.Netbird.Groups.List(ctx) groups, err := r.Netbird.Groups.List(ctx)
if err != nil { if err != nil {
@@ -99,37 +100,37 @@ func (r *NBGroupReconciler) syncNetBirdGroup(ctx context.Context, nbGroup *netbi
Name: nbGroup.Spec.Name, Name: nbGroup.Spec.Name,
}) })
if err != nil { 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) logger.Error(errNetBirdAPI, "error creating group", "err", err)
return ctrl.Result{}, err return ctrl.Result{}, err
} }
logger.Info("NBGroup: Created group on NetBird", "name", nbGroup.Spec.Name, "id", group.Id) logger.Info("NBGroup: Created group on NetBird", "name", nbGroup.Spec.Name, "id", group.Id)
nbGroup.Status.GroupID = &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 { } 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) logger.Info("NBGroup: Found group with same name on NetBird", "name", nbGroup.Spec.Name, "id", group.Id)
nbGroup.Status.GroupID = &group.Id nbGroup.Status.GroupID = &group.Id
nbGroup.Status.Conditions = netbirdiov1.NBConditionTrue() nbGroup.Status.Conditions = nbv1.NBConditionTrue()
} else if group == nil { } else if group == nil {
logger.Info("NBGroup: Group was deleted", "name", nbGroup.Spec.Name, "id", *nbGroup.Status.GroupID) logger.Info("NBGroup: Group was deleted", "name", nbGroup.Spec.Name, "id", *nbGroup.Status.GroupID)
nbGroup.Status.GroupID = nil 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 return ctrl.Result{Requeue: true}, nil
} else { } else {
nbGroup.Status.Conditions = netbirdiov1.NBConditionTrue() nbGroup.Status.Conditions = nbv1.NBConditionTrue()
} }
if nbGroup.Status.GroupID != nil && group != nil && *nbGroup.Status.GroupID != group.Id { 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 // 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 // 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.GroupID = &group.Id
nbGroup.Status.Conditions = netbirdiov1.NBConditionTrue() nbGroup.Status.Conditions = nbv1.NBConditionTrue()
} }
return ctrl.Result{}, nil 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 // Group doesn't exist on NetBird, no need for cleanup
if nbGroup.Status.GroupID == nil { if nbGroup.Status.GroupID == nil {
nbGroup.Finalizers = util.Without(nbGroup.Finalizers, "netbird.io/group-cleanup") 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()) { 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) logger.Info("group still linked to resources on netbird", "err", err)
// Check if group is defined elsewhere in the cluster // Check if group is defined elsewhere in the cluster
var groups netbirdiov1.NBGroupList var groups nbv1.NBGroupList
listErr := r.Client.List(ctx, &groups) listErr := r.Client.List(ctx, &groups)
if listErr != nil { if listErr != nil {
logger.Error(errKubernetesAPI, "error listing NBGroups", "err", listErr) 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. // SetupWithManager sets up the controller with the Manager.
func (r *NBGroupReconciler) SetupWithManager(mgr ctrl.Manager) error { func (r *NBGroupReconciler) SetupWithManager(mgr ctrl.Manager) error {
return ctrl.NewControllerManagedBy(mgr). return ctrl.NewControllerManagedBy(mgr).
For(&netbirdiov1.NBGroup{}). For(&nbv1.NBGroup{}).
Named("nbgroup"). Named("nbgroup").
Complete(r) Complete(r)
} }
+20 -19
View File
@@ -9,14 +9,15 @@ import (
. "github.com/onsi/ginkgo/v2" . "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega" . "github.com/onsi/gomega"
"k8s.io/apimachinery/pkg/api/errors" "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" "k8s.io/apimachinery/pkg/types"
"sigs.k8s.io/controller-runtime/pkg/reconcile" "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" netbird "github.com/netbirdio/netbird/shared/management/client/rest"
"github.com/netbirdio/netbird/shared/management/http/api" "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() { var _ = Describe("NBGroup Controller", func() {
@@ -33,7 +34,7 @@ var _ = Describe("NBGroup Controller", func() {
var netbirdClient *netbird.Client var netbirdClient *netbird.Client
var mux *http.ServeMux var mux *http.ServeMux
var server *httptest.Server var server *httptest.Server
var nbGroup netbirdiov1.NBGroup var nbGroup nbv1.NBGroup
BeforeEach(func() { BeforeEach(func() {
mux = &http.ServeMux{} mux = &http.ServeMux{}
@@ -46,13 +47,13 @@ var _ = Describe("NBGroup Controller", func() {
Expect(deleteErr).NotTo(HaveOccurred()) Expect(deleteErr).NotTo(HaveOccurred())
} }
if err == nil || errors.IsNotFound(err) { if err == nil || errors.IsNotFound(err) {
nbGroup = netbirdiov1.NBGroup{ nbGroup = nbv1.NBGroup{
ObjectMeta: v1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: resourceName, Name: resourceName,
Namespace: typeNamespacedName.Namespace, Namespace: typeNamespacedName.Namespace,
Finalizers: []string{"netbird.io/group-cleanup"}, Finalizers: []string{"netbird.io/group-cleanup"},
}, },
Spec: netbirdiov1.NBGroupSpec{ Spec: nbv1.NBGroupSpec{
Name: resourceName, Name: resourceName,
}, },
} }
@@ -63,7 +64,7 @@ var _ = Describe("NBGroup Controller", func() {
AfterEach(func() { AfterEach(func() {
server.Close() server.Close()
resource := &netbirdiov1.NBGroup{} resource := &nbv1.NBGroup{}
err := k8sClient.Get(ctx, typeNamespacedName, resource) err := k8sClient.Get(ctx, typeNamespacedName, resource)
if errors.IsNotFound(err) { if errors.IsNotFound(err) {
return return
@@ -113,8 +114,8 @@ var _ = Describe("NBGroup Controller", func() {
Expect(nbGroup.Status.GroupID).NotTo(BeNil()) Expect(nbGroup.Status.GroupID).NotTo(BeNil())
Expect(*nbGroup.Status.GroupID).To(Equal("Test")) Expect(*nbGroup.Status.GroupID).To(Equal("Test"))
Expect(nbGroup.Status.Conditions).To(HaveLen(1)) 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))
Expect(nbGroup.Status.Conditions[0].Type).To(Equal(netbirdiov1.NBSetupKeyReady)) 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).NotTo(BeNil())
Expect(*nbGroup.Status.GroupID).To(Equal("Test")) Expect(*nbGroup.Status.GroupID).To(Equal("Test"))
Expect(nbGroup.Status.Conditions).To(HaveLen(1)) 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))
Expect(nbGroup.Status.Conditions[0].Type).To(Equal(netbirdiov1.NBSetupKeyReady)) 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() { When("Group already exists in another namespace", func() {
It("Should delete NBGroup after linked failure", func() { It("Should delete NBGroup after linked failure", func() {
deleteGroup() deleteGroup()
otherGroup := &netbirdiov1.NBGroup{ otherGroup := &nbv1.NBGroup{
ObjectMeta: v1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: nbGroup.Name, Name: nbGroup.Name,
Namespace: "kube-system", Namespace: "kube-system",
}, },
Spec: netbirdiov1.NBGroupSpec{ Spec: nbv1.NBGroupSpec{
Name: nbGroup.Spec.Name, Name: nbGroup.Spec.Name,
}, },
} }
@@ -294,8 +295,8 @@ var _ = Describe("NBGroup Controller", func() {
Expect(nbGroup.Status.GroupID).NotTo(BeNil()) Expect(nbGroup.Status.GroupID).NotTo(BeNil())
Expect(*nbGroup.Status.GroupID).To(Equal("Test")) Expect(*nbGroup.Status.GroupID).To(Equal("Test"))
Expect(nbGroup.Status.Conditions).To(HaveLen(1)) 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))
Expect(nbGroup.Status.Conditions[0].Type).To(Equal(netbirdiov1.NBSetupKeyReady)) 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.GroupID).To(BeNil())
Expect(nbGroup.Status.Conditions).To(HaveLen(1)) 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{ _, err = controllerReconciler.Reconcile(ctx, reconcile.Request{
NamespacedName: typeNamespacedName, NamespacedName: typeNamespacedName,
@@ -353,7 +354,7 @@ var _ = Describe("NBGroup Controller", func() {
Expect(nbGroup.Status.GroupID).NotTo(BeNil()) Expect(nbGroup.Status.GroupID).NotTo(BeNil())
Expect(*nbGroup.Status.GroupID).To(Equal("Test")) Expect(*nbGroup.Status.GroupID).To(Equal("Test"))
Expect(nbGroup.Status.Conditions).To(HaveLen(1)) 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" "strings"
"github.com/go-logr/logr" "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/api/errors"
"k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/types"
ctrl "sigs.k8s.io/controller-runtime" ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client" "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" "github.com/netbirdio/kubernetes-operator/internal/util"
) )
@@ -39,16 +40,16 @@ const (
) )
// getResources get all NBResource objects in policy.status.managedServiceList // 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) { func (r *NBPolicyReconciler) getResources(ctx context.Context, nbPolicy *nbv1.NBPolicy, logger logr.Logger) ([]nbv1.NBResource, error) {
var resourceList []netbirdiov1.NBResource var resourceList []nbv1.NBResource
var updatedManagedServiceList []string var updatedManagedServiceList []string
for _, rss := range nbPolicy.Status.ManagedServiceList { 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]} namespacedName := types.NamespacedName{Namespace: strings.Split(rss, "/")[0], Name: strings.Split(rss, "/")[1]}
err := r.Client.Get(ctx, namespacedName, &resource) err := r.Client.Get(ctx, namespacedName, &resource)
if err != nil && !errors.IsNotFound(err) { if err != nil && !errors.IsNotFound(err) {
logger.Error(errKubernetesAPI, "Error getting NBResource", "namespace", namespacedName.Namespace, "name", namespacedName.Name) 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 return nil, err
} }
if err == nil && resource.DeletionTimestamp == nil { 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 // 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 *nbv1.NBPolicy, resources []nbv1.NBResource, logger logr.Logger) (map[string][]int32, []string, error) {
portMapping := map[string]map[int32]any{ portMapping := map[string]map[int32]any{
protocolTCP: make(map[int32]any), protocolTCP: make(map[int32]any),
protocolUDP: 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 // 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)) 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) 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{ 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 { if err != nil {
logger.Error(errNetBirdAPI, "Error creating Policy", "err", err) 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 return nil, err
} }
@@ -145,7 +146,7 @@ func (r *NBPolicyReconciler) createPolicy(ctx context.Context, nbPolicy *netbird
} }
// updatePolicy helper for updating policy with settings // 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)) 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) 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{ _, 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") { if err != nil && !strings.Contains(err.Error(), "not found") {
logger.Error(errNetBirdAPI, "Error updating Policy", "err", err) 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 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) logger.Info("Policy deleted from NetBird API, recreating", "protocol", protocol)
policyID = nil policyID = nil
requeue = true 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 { } else if err != nil {
return nil, false, err 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 := ctrl.Log.WithName("NBPolicy").WithValues("namespace", req.Namespace, "name", req.Name)
logger.Info("Reconciling NBPolicy") logger.Info("Reconciling NBPolicy")
var nbPolicy netbirdiov1.NBPolicy var nbPolicy nbv1.NBPolicy
err = r.Client.Get(ctx, req.NamespacedName, &nbPolicy) err = r.Client.Get(ctx, req.NamespacedName, &nbPolicy)
if err != nil { if err != nil {
if errors.IsNotFound(err) { 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) sourceGroupIDs, err := r.groupNamesToIDs(ctx, nbPolicy.Spec.SourceGroups, logger)
if err != nil { 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 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 return ctrl.Result{Requeue: requeue}, err
} }
nbPolicy.Status.Conditions = netbirdiov1.NBConditionTrue() nbPolicy.Status.Conditions = nbv1.NBConditionTrue()
return ctrl.Result{}, nil return ctrl.Result{}, nil
} }
// syncPolicy ensure upstream policy is up-to-date // 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 requeue := false
for protocol, ports := range portMapping { for protocol, ports := range portMapping {
@@ -275,7 +276,7 @@ func (r *NBPolicyReconciler) syncPolicy(ctx context.Context, nbPolicy *netbirdio
policyID = nbPolicy.Status.UDPPolicyID policyID = nbPolicy.Status.UDPPolicyID
default: default:
logger.Error(errKubernetesAPI, "Unknown protocol", "protocol", protocol) 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 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) 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)
if err != nil && !strings.Contains(err.Error(), "not found") { 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 return requeue, err
} }
policyID = nil policyID = nil
@@ -306,7 +307,7 @@ func (r *NBPolicyReconciler) syncPolicy(ctx context.Context, nbPolicy *netbirdio
logger.Info("Deleting policy", "protocol", protocol) logger.Info("Deleting policy", "protocol", protocol)
err := r.Netbird.Policies.Delete(ctx, *policyID) err := r.Netbird.Policies.Delete(ctx, *policyID)
if err != nil && !strings.Contains(err.Error(), "not found") { 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 return requeue, err
} }
policyID = nil policyID = nil
@@ -337,7 +338,7 @@ func (r *NBPolicyReconciler) syncPolicy(ctx context.Context, nbPolicy *netbirdio
nbPolicy.Status.UDPPolicyID = policyID nbPolicy.Status.UDPPolicyID = policyID
default: default:
logger.Error(errKubernetesAPI, "Unknown protocol", "protocol", protocol) 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 return requeue, errUnknownProtocol
} }
} }
@@ -345,7 +346,7 @@ func (r *NBPolicyReconciler) syncPolicy(ctx context.Context, nbPolicy *netbirdio
return requeue, nil 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 { if nbPolicy.Status.TCPPolicyID != nil {
err := r.Netbird.Policies.Delete(ctx, *nbPolicy.Status.TCPPolicyID) err := r.Netbird.Policies.Delete(ctx, *nbPolicy.Status.TCPPolicyID)
if err != nil && !strings.Contains("not found", err.Error()) { 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. // SetupWithManager sets up the controller with the Manager.
func (r *NBPolicyReconciler) SetupWithManager(mgr ctrl.Manager) error { func (r *NBPolicyReconciler) SetupWithManager(mgr ctrl.Manager) error {
return ctrl.NewControllerManagedBy(mgr). return ctrl.NewControllerManagedBy(mgr).
For(&netbirdiov1.NBPolicy{}). For(&nbv1.NBPolicy{}).
Named("nbpolicy"). Named("nbpolicy").
Complete(r) Complete(r)
} }
+26 -26
View File
@@ -11,16 +11,16 @@ import (
. "github.com/onsi/ginkgo/v2" . "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega" . "github.com/onsi/gomega"
"k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/types"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/reconcile" "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" netbird "github.com/netbirdio/netbird/shared/management/client/rest"
"github.com/netbirdio/netbird/shared/management/http/api" "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() { var _ = Describe("NBPolicy Controller", func() {
@@ -32,7 +32,7 @@ var _ = Describe("NBPolicy Controller", func() {
typeNamespacedName := types.NamespacedName{ typeNamespacedName := types.NamespacedName{
Name: resourceName, Name: resourceName,
} }
nbpolicy := &netbirdiov1.NBPolicy{} nbpolicy := &nbv1.NBPolicy{}
var netbirdClient *netbird.Client var netbirdClient *netbird.Client
var mux *http.ServeMux var mux *http.ServeMux
var server *httptest.Server var server *httptest.Server
@@ -46,12 +46,12 @@ var _ = Describe("NBPolicy Controller", func() {
By("creating the custom resource for the Kind NBPolicy") By("creating the custom resource for the Kind NBPolicy")
err := k8sClient.Get(ctx, typeNamespacedName, nbpolicy) err := k8sClient.Get(ctx, typeNamespacedName, nbpolicy)
if err != nil && errors.IsNotFound(err) { if err != nil && errors.IsNotFound(err) {
resource := &netbirdiov1.NBPolicy{ resource := &nbv1.NBPolicy{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: resourceName, Name: resourceName,
Finalizers: []string{"netbird.io/cleanup"}, Finalizers: []string{"netbird.io/cleanup"},
}, },
Spec: netbirdiov1.NBPolicySpec{ Spec: nbv1.NBPolicySpec{
Name: "Test", Name: "Test",
SourceGroups: []string{"All"}, SourceGroups: []string{"All"},
Bidirectional: true, Bidirectional: true,
@@ -63,7 +63,7 @@ var _ = Describe("NBPolicy Controller", func() {
}) })
AfterEach(func() { AfterEach(func() {
resource := &netbirdiov1.NBPolicy{} resource := &nbv1.NBPolicy{}
err := k8sClient.Get(ctx, typeNamespacedName, resource) err := k8sClient.Get(ctx, typeNamespacedName, resource)
if !errors.IsNotFound(err) { if !errors.IsNotFound(err) {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
@@ -77,7 +77,7 @@ var _ = Describe("NBPolicy Controller", func() {
Expect(k8sClient.Delete(ctx, resource)).To(Succeed()) Expect(k8sClient.Delete(ctx, resource)).To(Succeed())
} }
nbresource := &netbirdiov1.NBResource{} nbresource := &nbv1.NBResource{}
err = k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "test"}, nbresource) err = k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "test"}, nbresource)
if !errors.IsNotFound(err) { if !errors.IsNotFound(err) {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
@@ -120,12 +120,12 @@ var _ = Describe("NBPolicy Controller", func() {
Netbird: netbirdClient, Netbird: netbirdClient,
} }
nbResource := &netbirdiov1.NBResource{ nbResource := &nbv1.NBResource{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "test", Name: "test",
Namespace: "default", Namespace: "default",
}, },
Spec: netbirdiov1.NBResourceSpec{ Spec: nbv1.NBResourceSpec{
Name: "meow", Name: "meow",
Groups: []string{"test"}, Groups: []string{"test"},
NetworkID: "test", NetworkID: "test",
@@ -136,7 +136,7 @@ var _ = Describe("NBPolicy Controller", func() {
} }
Expect(k8sClient.Create(ctx, nbResource)).To(Succeed()) Expect(k8sClient.Create(ctx, nbResource)).To(Succeed())
nbResource.Status = netbirdiov1.NBResourceStatus{ nbResource.Status = nbv1.NBResourceStatus{
TCPPorts: []int32{443}, TCPPorts: []int32{443},
PolicyName: &resourceName, PolicyName: &resourceName,
Groups: []string{"test"}, Groups: []string{"test"},
@@ -258,12 +258,12 @@ var _ = Describe("NBPolicy Controller", func() {
Netbird: netbirdClient, Netbird: netbirdClient,
} }
nbResource := &netbirdiov1.NBResource{ nbResource := &nbv1.NBResource{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "test", Name: "test",
Namespace: "default", Namespace: "default",
}, },
Spec: netbirdiov1.NBResourceSpec{ Spec: nbv1.NBResourceSpec{
Name: "meow", Name: "meow",
Groups: []string{"test"}, Groups: []string{"test"},
NetworkID: "test", NetworkID: "test",
@@ -274,7 +274,7 @@ var _ = Describe("NBPolicy Controller", func() {
} }
Expect(k8sClient.Create(ctx, nbResource)).To(Succeed()) Expect(k8sClient.Create(ctx, nbResource)).To(Succeed())
nbResource.Status = netbirdiov1.NBResourceStatus{ nbResource.Status = nbv1.NBResourceStatus{
UDPPorts: []int32{443}, UDPPorts: []int32{443},
PolicyName: &resourceName, PolicyName: &resourceName,
Groups: []string{"test"}, Groups: []string{"test"},
@@ -396,12 +396,12 @@ var _ = Describe("NBPolicy Controller", func() {
Netbird: netbirdClient, Netbird: netbirdClient,
} }
nbResource := &netbirdiov1.NBResource{ nbResource := &nbv1.NBResource{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "test", Name: "test",
Namespace: "default", Namespace: "default",
}, },
Spec: netbirdiov1.NBResourceSpec{ Spec: nbv1.NBResourceSpec{
Name: "meow", Name: "meow",
Groups: []string{"test"}, Groups: []string{"test"},
NetworkID: "test", NetworkID: "test",
@@ -412,7 +412,7 @@ var _ = Describe("NBPolicy Controller", func() {
} }
Expect(k8sClient.Create(ctx, nbResource)).To(Succeed()) Expect(k8sClient.Create(ctx, nbResource)).To(Succeed())
nbResource.Status = netbirdiov1.NBResourceStatus{ nbResource.Status = nbv1.NBResourceStatus{
TCPPorts: []int32{443}, TCPPorts: []int32{443},
PolicyName: &resourceName, PolicyName: &resourceName,
Groups: []string{"test"}, Groups: []string{"test"},
@@ -459,7 +459,7 @@ var _ = Describe("NBPolicy Controller", func() {
When("Updating existing policy", func() { When("Updating existing policy", func() {
AfterEach(func() { AfterEach(func() {
nbresource := &netbirdiov1.NBResource{} nbresource := &nbv1.NBResource{}
err := k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "test-b"}, nbresource) err := k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "test-b"}, nbresource)
if !errors.IsNotFound(err) { if !errors.IsNotFound(err) {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
@@ -475,12 +475,12 @@ var _ = Describe("NBPolicy Controller", func() {
Netbird: netbirdClient, Netbird: netbirdClient,
} }
nbResource := &netbirdiov1.NBResource{ nbResource := &nbv1.NBResource{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "test", Name: "test",
Namespace: "default", Namespace: "default",
}, },
Spec: netbirdiov1.NBResourceSpec{ Spec: nbv1.NBResourceSpec{
Name: "meow", Name: "meow",
Groups: []string{"test"}, Groups: []string{"test"},
NetworkID: "test", NetworkID: "test",
@@ -491,19 +491,19 @@ var _ = Describe("NBPolicy Controller", func() {
} }
Expect(k8sClient.Create(ctx, nbResource)).To(Succeed()) Expect(k8sClient.Create(ctx, nbResource)).To(Succeed())
nbResource.Status = netbirdiov1.NBResourceStatus{ nbResource.Status = nbv1.NBResourceStatus{
TCPPorts: []int32{443}, TCPPorts: []int32{443},
PolicyName: &resourceName, PolicyName: &resourceName,
Groups: []string{"test"}, Groups: []string{"test"},
} }
Expect(k8sClient.Status().Update(ctx, nbResource)).To(Succeed()) Expect(k8sClient.Status().Update(ctx, nbResource)).To(Succeed())
nbResourceB := &netbirdiov1.NBResource{ nbResourceB := &nbv1.NBResource{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "test-b", Name: "test-b",
Namespace: "default", Namespace: "default",
}, },
Spec: netbirdiov1.NBResourceSpec{ Spec: nbv1.NBResourceSpec{
Name: "meow-b", Name: "meow-b",
Groups: []string{"test-b"}, Groups: []string{"test-b"},
NetworkID: "test", NetworkID: "test",
@@ -514,7 +514,7 @@ var _ = Describe("NBPolicy Controller", func() {
} }
Expect(k8sClient.Create(ctx, nbResourceB)).To(Succeed()) Expect(k8sClient.Create(ctx, nbResourceB)).To(Succeed())
nbResourceB.Status = netbirdiov1.NBResourceStatus{ nbResourceB.Status = nbv1.NBResourceStatus{
TCPPorts: []int32{80}, TCPPorts: []int32{80},
PolicyName: &resourceName, PolicyName: &resourceName,
Groups: []string{"test-b"}, Groups: []string{"test-b"},
+47 -46
View File
@@ -2,17 +2,15 @@ package controller
import ( import (
"context" "context"
nerrors "errors" "errors"
"fmt" "fmt"
"slices" "slices"
"strings" "strings"
"time" "time"
"github.com/go-logr/logr" "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" 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" "k8s.io/apimachinery/pkg/types"
ctrl "sigs.k8s.io/controller-runtime" ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client" "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/log"
"sigs.k8s.io/controller-runtime/pkg/reconcile" "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" "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 := ctrl.Log.WithName("NBResource").WithValues("namespace", req.Namespace, "name", req.Name)
logger.Info("Reconciling NBResource") logger.Info("Reconciling NBResource")
nbResource := &netbirdiov1.NBResource{} nbResource := &nbv1.NBResource{}
err = r.Client.Get(ctx, req.NamespacedName, nbResource) err = r.Client.Get(ctx, req.NamespacedName, nbResource)
if err != nil { if err != nil {
if !kerrors.IsNotFound(err) { 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) groupIDs, result, err := r.handleGroups(ctx, req, nbResource, logger)
if result != nil { 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 return *result, err
} }
resource, err := r.handleNetBirdResource(ctx, nbResource, groupIDs, logger) 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 return ctrl.Result{RequeueAfter: defaultRequeueAfter}, nil
} }
if err != 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 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) err = r.handleGroupUpdate(ctx, nbResource, groupIDs, resource, logger)
if err != nil { 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 return ctrl.Result{}, err
} }
err = r.handlePolicy(ctx, req, nbResource, groupIDs, logger) err = r.handlePolicy(ctx, req, nbResource, groupIDs, logger)
if err != nil { 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 return ctrl.Result{}, err
} }
nbResource.Status.Conditions = netbirdiov1.NBConditionTrue() nbResource.Status.Conditions = nbv1.NBConditionTrue()
return ctrl.Result{}, nil 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 { if len(nbResource.Spec.PolicySourceGroups) == 0 {
logger.Error(errInvalidValue, "Cannot auto-generate policy, missing source groups.") logger.Error(errInvalidValue, "Cannot auto-generate policy, missing source groups.")
return fmt.Errorf("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) 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) generatedName := fmt.Sprintf("%s-%s-%s", policy, req.Namespace, req.Name)
*nbPolicy = netbirdiov1.NBPolicy{ *nbPolicy = nbv1.NBPolicy{
ObjectMeta: v1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: generatedName, Name: generatedName,
Annotations: map[string]string{"netbird.io/generated-by": req.NamespacedName.String()}, Annotations: map[string]string{"netbird.io/generated-by": req.NamespacedName.String()},
Finalizers: []string{"netbird.io/cleanup"}, Finalizers: []string{"netbird.io/cleanup"},
Labels: r.DefaultLabels, Labels: r.DefaultLabels,
}, },
Spec: netbirdiov1.NBPolicySpec{ Spec: nbv1.NBPolicySpec{
Name: name, Name: name,
Description: "Generated by " + req.NamespacedName.String(), Description: "Generated by " + req.NamespacedName.String(),
SourceGroups: nbResource.Spec.PolicySourceGroups, SourceGroups: nbResource.Spec.PolicySourceGroups,
@@ -172,7 +173,7 @@ func (r *NBResourceReconciler) handlePolicyCreate(ctx context.Context, nbResourc
} }
nbPolicy.Labels = r.DefaultLabels nbPolicy.Labels = r.DefaultLabels
nbPolicy.Annotations["netbird.io/generated-by"] = req.NamespacedName.String() nbPolicy.Annotations["netbird.io/generated-by"] = req.NamespacedName.String()
nbPolicy.Spec = netbirdiov1.NBPolicySpec{ nbPolicy.Spec = nbv1.NBPolicySpec{
Name: name, Name: name,
Description: "Generated by " + req.NamespacedName.String(), Description: "Generated by " + req.NamespacedName.String(),
SourceGroups: nbResource.Spec.PolicySourceGroups, SourceGroups: nbResource.Spec.PolicySourceGroups,
@@ -205,8 +206,8 @@ func (r *NBResourceReconciler) handlePolicyCreate(ctx context.Context, nbResourc
return nil return nil
} }
func (r *NBResourceReconciler) handlePolicyAddUpdate(ctx context.Context, req ctrl.Request, nbResource *netbirdiov1.NBResource, policy string, groupIDs []string, logger logr.Logger) error { func (r *NBResourceReconciler) handlePolicyAddUpdate(ctx context.Context, req ctrl.Request, nbResource *nbv1.NBResource, policy string, groupIDs []string, logger logr.Logger) error {
var nbPolicy netbirdiov1.NBPolicy var nbPolicy nbv1.NBPolicy
updatePolicyStatus := false updatePolicyStatus := false
kubernetesPolicyName := policy kubernetesPolicyName := policy
@@ -234,19 +235,19 @@ func (r *NBResourceReconciler) handlePolicyAddUpdate(ctx context.Context, req ct
if !util.Equivalent(nbResource.Spec.TCPPorts, nbResource.Status.TCPPorts) { if !util.Equivalent(nbResource.Spec.TCPPorts, nbResource.Status.TCPPorts) {
nbResource.Status.TCPPorts = nbResource.Spec.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 updatePolicyStatus = true
} }
if !util.Equivalent(nbResource.Spec.UDPPorts, nbResource.Status.UDPPorts) { if !util.Equivalent(nbResource.Spec.UDPPorts, nbResource.Status.UDPPorts) {
nbResource.Status.UDPPorts = nbResource.Spec.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 updatePolicyStatus = true
} }
if !util.Equivalent(nbResource.Status.Groups, groupIDs) { if !util.Equivalent(nbResource.Status.Groups, groupIDs) {
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 updatePolicyStatus = true
} }
@@ -301,8 +302,8 @@ func (r *NBResourceReconciler) handlePolicyAddUpdate(ctx context.Context, req ct
return nil return nil
} }
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 *nbv1.NBResource, specPolicies []string, policy string, logger logr.Logger) error {
var nbPolicy netbirdiov1.NBPolicy var nbPolicy nbv1.NBPolicy
if !slices.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 {
@@ -326,7 +327,7 @@ func (r *NBResourceReconciler) handlePolicyDelete(ctx context.Context, req ctrl.
delete(nbResource.Status.PolicyNameMapping, policy) delete(nbResource.Status.PolicyNameMapping, policy)
} else if slices.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 = &metav1.Time{Time: time.Now()}
err := r.Client.Status().Update(ctx, &nbPolicy) err := r.Client.Status().Update(ctx, &nbPolicy)
if err != nil { if err != nil {
logger.Error(errKubernetesAPI, "error updating NBPolicy", "err", err, "policyName", policy) 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 // 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 == "" { if nbResource.Status.PolicyName == nil && nbResource.Spec.PolicyName == "" {
return nil return nil
} }
@@ -372,7 +373,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 *nbv1.NBResource, groupIDs []string, resource *api.NetworkResource, logger logr.Logger) error {
// Handle possible updated group IDs // Handle possible updated group IDs
groupIDMap := make(map[string]any) groupIDMap := make(map[string]any)
for _, g := range groupIDs { for _, g := range groupIDs {
@@ -405,7 +406,7 @@ func (r *NBResourceReconciler) handleGroupUpdate(ctx context.Context, nbResource
} }
// handleNetBirdResource sync NetBird Network Resource // 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 resource *api.NetworkResource
var err error var err error
if nbResource.Status.NetworkResourceID != nil { 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") { if err != nil && strings.Contains(err.Error(), "already exists") {
log.Log.Error(errNetBirdAPI, "network resource with the same name already exists", "err", err) 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 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 // 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) { func (r *NBResourceReconciler) handleGroups(ctx context.Context, req ctrl.Request, nbResource *nbv1.NBResource, logger logr.Logger) ([]string, *ctrl.Result, error) {
nbGroupList := netbirdiov1.NBGroupList{} nbGroupList := nbv1.NBGroupList{}
err := r.Client.List(ctx, &nbGroupList, &client.ListOptions{Namespace: req.Namespace}) err := r.Client.List(ctx, &nbGroupList, &client.ListOptions{Namespace: req.Namespace})
if err != nil { if err != nil {
logger.Error(errKubernetesAPI, "error listing NBGroup", "err", err) 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 var groupIDs []string
for _, groupName := range nbResource.Spec.Groups { for _, groupName := range nbResource.Spec.Groups {
nbGroup := netbirdiov1.NBGroup{} nbGroup := nbv1.NBGroup{}
groupNameRFC := strings.ToLower(groupName) groupNameRFC := strings.ToLower(groupName)
groupNameRFC = strings.ReplaceAll(groupNameRFC, " ", "-") groupNameRFC = strings.ReplaceAll(groupNameRFC, " ", "-")
err := r.Client.Get(ctx, types.NamespacedName{Namespace: req.Namespace, Name: groupNameRFC}, &nbGroup) 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 return nil, &ctrl.Result{}, err
} else if kerrors.IsNotFound(err) { } else if kerrors.IsNotFound(err) {
// Create NBGroup // Create NBGroup
nbGroup = netbirdiov1.NBGroup{ nbGroup = nbv1.NBGroup{
ObjectMeta: v1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: groupNameRFC, Name: groupNameRFC,
Namespace: nbResource.Namespace, Namespace: nbResource.Namespace,
OwnerReferences: []v1.OwnerReference{ OwnerReferences: []metav1.OwnerReference{
{ {
APIVersion: netbirdiov1.GroupVersion.Identifier(), APIVersion: nbv1.GroupVersion.Identifier(),
Kind: "NBResource", Kind: "NBResource",
Name: nbResource.Name, Name: nbResource.Name,
UID: nbResource.UID, 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"}, Finalizers: []string{"netbird.io/group-cleanup", "netbird.io/resource-cleanup"},
Labels: r.DefaultLabels, Labels: r.DefaultLabels,
}, },
Spec: netbirdiov1.NBGroupSpec{ Spec: nbv1.NBGroupSpec{
Name: groupName, Name: groupName,
}, },
} }
@@ -558,8 +559,8 @@ func (r *NBResourceReconciler) handleGroups(ctx context.Context, req ctrl.Reques
} }
if !ownerExists { if !ownerExists {
nbGroup.OwnerReferences = append(nbGroup.OwnerReferences, v1.OwnerReference{ nbGroup.OwnerReferences = append(nbGroup.OwnerReferences, metav1.OwnerReference{
APIVersion: netbirdiov1.GroupVersion.Identifier(), APIVersion: nbv1.GroupVersion.Identifier(),
Kind: "NBResource", Kind: "NBResource",
Name: nbResource.Name, Name: nbResource.Name,
UID: nbResource.UID, UID: nbResource.UID,
@@ -587,10 +588,10 @@ func (r *NBResourceReconciler) handleGroups(ctx context.Context, req ctrl.Reques
return groupIDs, nil, nil 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 { if nbResource.Status.PolicyName != nil {
for _, policy := range util.SplitTrim(*nbResource.Status.PolicyName, ",") { 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) err := r.Client.Get(ctx, types.NamespacedName{Name: policy}, &nbPolicy)
if err != nil && !kerrors.IsNotFound(err) { if err != nil && !kerrors.IsNotFound(err) {
return 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()) { 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.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) err = r.Client.Status().Update(ctx, &nbPolicy)
if err != nil { if err != nil {
return err 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}) err := r.Client.List(ctx, &nbGroupList, &client.ListOptions{Namespace: req.Namespace})
if err != nil { if err != nil {
return err return err
@@ -658,9 +659,9 @@ func (r *NBResourceReconciler) reconcileDelete(ctx context.Context, req ctrl.Req
// SetupWithManager sets up the controller with the Manager. // SetupWithManager sets up the controller with the Manager.
func (r *NBResourceReconciler) SetupWithManager(mgr ctrl.Manager) error { func (r *NBResourceReconciler) SetupWithManager(mgr ctrl.Manager) error {
return ctrl.NewControllerManagedBy(mgr). return ctrl.NewControllerManagedBy(mgr).
For(&netbirdiov1.NBResource{}). For(&nbv1.NBResource{}).
Watches(&netbirdiov1.NBGroup{}, handler.EnqueueRequestForOwner(mgr.GetScheme(), mgr.GetRESTMapper(), &netbirdiov1.NBResource{})). Watches(&nbv1.NBGroup{}, handler.EnqueueRequestForOwner(mgr.GetScheme(), mgr.GetRESTMapper(), &nbv1.NBResource{})).
Watches(&netbirdiov1.NBPolicy{}, handler.EnqueueRequestsFromMapFunc(func(ctx context.Context, obj client.Object) []reconcile.Request { Watches(&nbv1.NBPolicy{}, handler.EnqueueRequestsFromMapFunc(func(ctx context.Context, obj client.Object) []reconcile.Request {
if v, ok := obj.GetAnnotations()["netbird.io/generated-by"]; ok { if v, ok := obj.GetAnnotations()["netbird.io/generated-by"]; ok {
return []reconcile.Request{ return []reconcile.Request{
{ {
@@ -11,16 +11,16 @@ import (
. "github.com/onsi/ginkgo/v2" . "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega" . "github.com/onsi/gomega"
"k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/types"
ctrl "sigs.k8s.io/controller-runtime" ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/reconcile" "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" netbird "github.com/netbirdio/netbird/shared/management/client/rest"
"github.com/netbirdio/netbird/shared/management/http/api" "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("NBResource Controller", func() { var _ = Describe("NBResource Controller", func() {
@@ -34,7 +34,7 @@ var _ = Describe("NBResource Controller", func() {
Name: resourceName, Name: resourceName,
Namespace: "default", Namespace: "default",
} }
nbresource := &netbirdiov1.NBResource{} nbresource := &nbv1.NBResource{}
var netbirdClient *netbird.Client var netbirdClient *netbird.Client
var mux *http.ServeMux var mux *http.ServeMux
var server *httptest.Server var server *httptest.Server
@@ -55,13 +55,13 @@ var _ = Describe("NBResource Controller", func() {
By("creating the custom resource for the Kind NBResource") By("creating the custom resource for the Kind NBResource")
err := k8sClient.Get(ctx, typeNamespacedName, nbresource) err := k8sClient.Get(ctx, typeNamespacedName, nbresource)
if err != nil && errors.IsNotFound(err) { if err != nil && errors.IsNotFound(err) {
nbresource = &netbirdiov1.NBResource{ nbresource = &nbv1.NBResource{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: resourceName, Name: resourceName,
Namespace: "default", Namespace: "default",
Finalizers: []string{"netbird.io/cleanup"}, Finalizers: []string{"netbird.io/cleanup"},
}, },
Spec: netbirdiov1.NBResourceSpec{ Spec: nbv1.NBResourceSpec{
Name: "Test", Name: "Test",
NetworkID: "test", NetworkID: "test",
Address: "test.default.svc.cluster.local", Address: "test.default.svc.cluster.local",
@@ -74,7 +74,7 @@ var _ = Describe("NBResource Controller", func() {
}) })
AfterEach(func() { AfterEach(func() {
resource := &netbirdiov1.NBResource{} resource := &nbv1.NBResource{}
err := k8sClient.Get(ctx, typeNamespacedName, resource) err := k8sClient.Get(ctx, typeNamespacedName, resource)
if !errors.IsNotFound(err) { if !errors.IsNotFound(err) {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
@@ -107,7 +107,7 @@ var _ = Describe("NBResource Controller", func() {
When("Network Resource doesn't exist", Ordered, func() { When("Network Resource doesn't exist", Ordered, func() {
AfterAll(func() { AfterAll(func() {
nbGroup := &netbirdiov1.NBGroup{} nbGroup := &nbv1.NBGroup{}
err := k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "meow"}, nbGroup) err := k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "meow"}, nbGroup)
if !errors.IsNotFound(err) { if !errors.IsNotFound(err) {
if len(nbGroup.Finalizers) > 0 { if len(nbGroup.Finalizers) > 0 {
@@ -123,7 +123,7 @@ var _ = Describe("NBResource Controller", func() {
NamespacedName: typeNamespacedName, NamespacedName: typeNamespacedName,
}) })
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
nbGroup := &netbirdiov1.NBGroup{} nbGroup := &nbv1.NBGroup{}
Expect(k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "meow"}, nbGroup)).To(Succeed()) Expect(k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "meow"}, nbGroup)).To(Succeed())
Expect(nbGroup.Labels).To(HaveKeyWithValue("dog", "bark")) Expect(nbGroup.Labels).To(HaveKeyWithValue("dog", "bark"))
nbGroup.Status.GroupID = util.Ptr("test") nbGroup.Status.GroupID = util.Ptr("test")
@@ -181,21 +181,21 @@ var _ = Describe("NBResource Controller", func() {
nbresource.Status.NetworkResourceID = util.Ptr("test") nbresource.Status.NetworkResourceID = util.Ptr("test")
Expect(k8sClient.Status().Update(ctx, nbresource)).To(Succeed()) Expect(k8sClient.Status().Update(ctx, nbresource)).To(Succeed())
nbGroup := &netbirdiov1.NBGroup{ nbGroup := &nbv1.NBGroup{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "meow", Name: "meow",
Namespace: "default", Namespace: "default",
Finalizers: []string{"netbird.io/resource-cleanup"}, Finalizers: []string{"netbird.io/resource-cleanup"},
OwnerReferences: []metav1.OwnerReference{ OwnerReferences: []metav1.OwnerReference{
{ {
APIVersion: netbirdiov1.GroupVersion.Identifier(), APIVersion: nbv1.GroupVersion.Identifier(),
Kind: "NBResource", Kind: "NBResource",
Name: "test-resource", Name: "test-resource",
UID: nbresource.UID, UID: nbresource.UID,
}, },
}, },
}, },
Spec: netbirdiov1.NBGroupSpec{ Spec: nbv1.NBGroupSpec{
Name: "meow", Name: "meow",
}, },
} }
@@ -206,7 +206,7 @@ var _ = Describe("NBResource Controller", func() {
}) })
AfterEach(func() { AfterEach(func() {
nbGroup := &netbirdiov1.NBGroup{} nbGroup := &nbv1.NBGroup{}
err := k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "meow"}, nbGroup) err := k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "meow"}, nbGroup)
if !errors.IsNotFound(err) { if !errors.IsNotFound(err) {
if len(nbGroup.Finalizers) > 0 { if len(nbGroup.Finalizers) > 0 {
@@ -321,22 +321,22 @@ var _ = Describe("NBResource Controller", func() {
When("Policy is specified", Ordered, func() { When("Policy is specified", Ordered, func() {
When("Policy Exists", func() { When("Policy Exists", func() {
BeforeAll(func() { BeforeAll(func() {
nbPolicy := &netbirdiov1.NBPolicy{ nbPolicy := &nbv1.NBPolicy{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "test-a", Name: "test-a",
}, },
Spec: netbirdiov1.NBPolicySpec{ Spec: nbv1.NBPolicySpec{
Name: "Test A", Name: "Test A",
SourceGroups: []string{"All"}, SourceGroups: []string{"All"},
}, },
} }
Expect(k8sClient.Create(ctx, nbPolicy)).To(Succeed()) Expect(k8sClient.Create(ctx, nbPolicy)).To(Succeed())
nbPolicy = &netbirdiov1.NBPolicy{ nbPolicy = &nbv1.NBPolicy{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "test-b", Name: "test-b",
}, },
Spec: netbirdiov1.NBPolicySpec{ Spec: nbv1.NBPolicySpec{
Name: "Test B", Name: "Test B",
SourceGroups: []string{"All"}, SourceGroups: []string{"All"},
}, },
@@ -345,13 +345,13 @@ var _ = Describe("NBResource Controller", func() {
}) })
AfterAll(func() { AfterAll(func() {
nbPolicy := &netbirdiov1.NBPolicy{} nbPolicy := &nbv1.NBPolicy{}
err := k8sClient.Get(ctx, types.NamespacedName{Name: "test-a"}, nbPolicy) err := k8sClient.Get(ctx, types.NamespacedName{Name: "test-a"}, nbPolicy)
if !errors.IsNotFound(err) { if !errors.IsNotFound(err) {
Expect(k8sClient.Delete(ctx, nbPolicy)).To(Succeed()) Expect(k8sClient.Delete(ctx, nbPolicy)).To(Succeed())
} }
nbPolicy = &netbirdiov1.NBPolicy{} nbPolicy = &nbv1.NBPolicy{}
err = k8sClient.Get(ctx, types.NamespacedName{Name: "test-b"}, nbPolicy) err = k8sClient.Get(ctx, types.NamespacedName{Name: "test-b"}, nbPolicy)
if !errors.IsNotFound(err) { if !errors.IsNotFound(err) {
Expect(k8sClient.Delete(ctx, nbPolicy)).To(Succeed()) Expect(k8sClient.Delete(ctx, nbPolicy)).To(Succeed())
@@ -366,7 +366,7 @@ var _ = Describe("NBResource Controller", func() {
}) })
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
nbPolicy := &netbirdiov1.NBPolicy{} nbPolicy := &nbv1.NBPolicy{}
Expect(k8sClient.Get(ctx, types.NamespacedName{Name: "test-a"}, nbPolicy)).To(Succeed()) Expect(k8sClient.Get(ctx, types.NamespacedName{Name: "test-a"}, nbPolicy)).To(Succeed())
Expect(nbPolicy.Status.ManagedServiceList).To(ContainElement("default/test-resource")) Expect(nbPolicy.Status.ManagedServiceList).To(ContainElement("default/test-resource"))
}) })
@@ -384,11 +384,11 @@ var _ = Describe("NBResource Controller", func() {
}) })
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
nbPolicy := &netbirdiov1.NBPolicy{} nbPolicy := &nbv1.NBPolicy{}
Expect(k8sClient.Get(ctx, types.NamespacedName{Name: "test-a"}, nbPolicy)).To(Succeed()) Expect(k8sClient.Get(ctx, types.NamespacedName{Name: "test-a"}, nbPolicy)).To(Succeed())
Expect(nbPolicy.Status.ManagedServiceList).NotTo(ContainElement("default/test-resource")) Expect(nbPolicy.Status.ManagedServiceList).NotTo(ContainElement("default/test-resource"))
nbPolicy = &netbirdiov1.NBPolicy{} nbPolicy = &nbv1.NBPolicy{}
Expect(k8sClient.Get(ctx, types.NamespacedName{Name: "test-b"}, nbPolicy)).To(Succeed()) Expect(k8sClient.Get(ctx, types.NamespacedName{Name: "test-b"}, nbPolicy)).To(Succeed())
Expect(nbPolicy.Status.ManagedServiceList).To(ContainElement("default/test-resource")) Expect(nbPolicy.Status.ManagedServiceList).To(ContainElement("default/test-resource"))
}) })
@@ -396,7 +396,7 @@ var _ = Describe("NBResource Controller", func() {
When("Policy is removed", func() { When("Policy is removed", func() {
It("should remove old reference", func() { It("should remove old reference", func() {
nbPolicy := &netbirdiov1.NBPolicy{} nbPolicy := &nbv1.NBPolicy{}
Expect(k8sClient.Get(ctx, types.NamespacedName{Name: "test-a"}, nbPolicy)).To(Succeed()) Expect(k8sClient.Get(ctx, types.NamespacedName{Name: "test-a"}, nbPolicy)).To(Succeed())
nbPolicy.Status.ManagedServiceList = []string{"default/test-resource"} nbPolicy.Status.ManagedServiceList = []string{"default/test-resource"}
Expect(k8sClient.Status().Update(ctx, nbPolicy)).To(Succeed()) Expect(k8sClient.Status().Update(ctx, nbPolicy)).To(Succeed())
@@ -412,7 +412,7 @@ var _ = Describe("NBResource Controller", func() {
}) })
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
nbPolicy = &netbirdiov1.NBPolicy{} nbPolicy = &nbv1.NBPolicy{}
Expect(k8sClient.Get(ctx, types.NamespacedName{Name: "test-a"}, nbPolicy)).To(Succeed()) Expect(k8sClient.Get(ctx, types.NamespacedName{Name: "test-a"}, nbPolicy)).To(Succeed())
Expect(nbPolicy.Status.ManagedServiceList).NotTo(ContainElement("default/test-resource")) Expect(nbPolicy.Status.ManagedServiceList).NotTo(ContainElement("default/test-resource"))
}) })
@@ -425,7 +425,7 @@ var _ = Describe("NBResource Controller", func() {
controllerReconciler.AllowAutomaticPolicyCreation = true controllerReconciler.AllowAutomaticPolicyCreation = true
}) })
AfterEach(func() { AfterEach(func() {
nbPolicy := &netbirdiov1.NBPolicy{} nbPolicy := &nbv1.NBPolicy{}
err := k8sClient.Get(ctx, types.NamespacedName{Name: "test-gen-" + nbresource.Namespace + "-" + nbresource.Name}, nbPolicy) err := k8sClient.Get(ctx, types.NamespacedName{Name: "test-gen-" + nbresource.Namespace + "-" + nbresource.Name}, nbPolicy)
if !errors.IsNotFound(err) { if !errors.IsNotFound(err) {
if len(nbPolicy.Finalizers) > 0 { if len(nbPolicy.Finalizers) > 0 {
@@ -452,7 +452,7 @@ var _ = Describe("NBResource Controller", func() {
Expect(k8sClient.Get(ctx, typeNamespacedName, nbresource)).To(Succeed()) Expect(k8sClient.Get(ctx, typeNamespacedName, nbresource)).To(Succeed())
Expect(nbresource.Status.PolicyNameMapping).To(HaveKey(policyGenName)) Expect(nbresource.Status.PolicyNameMapping).To(HaveKey(policyGenName))
nbPolicy := &netbirdiov1.NBPolicy{} nbPolicy := &nbv1.NBPolicy{}
Expect(k8sClient.Get(ctx, types.NamespacedName{Name: nbresource.Status.PolicyNameMapping[policyGenName]}, nbPolicy)).To(Succeed()) Expect(k8sClient.Get(ctx, types.NamespacedName{Name: nbresource.Status.PolicyNameMapping[policyGenName]}, nbPolicy)).To(Succeed())
Expect(nbPolicy.Status.ManagedServiceList).To(ContainElement("default/test-resource")) Expect(nbPolicy.Status.ManagedServiceList).To(ContainElement("default/test-resource"))
Expect(nbPolicy.Labels).To(HaveKeyWithValue("dog", "bark")) Expect(nbPolicy.Labels).To(HaveKeyWithValue("dog", "bark"))
@@ -486,7 +486,7 @@ var _ = Describe("NBResource Controller", func() {
Expect(k8sClient.Get(ctx, typeNamespacedName, nbresource)).To(Succeed()) Expect(k8sClient.Get(ctx, typeNamespacedName, nbresource)).To(Succeed())
Expect(nbresource.Status.PolicyNameMapping).To(HaveKey(policyGenName)) Expect(nbresource.Status.PolicyNameMapping).To(HaveKey(policyGenName))
nbPolicy := &netbirdiov1.NBPolicy{} nbPolicy := &nbv1.NBPolicy{}
Expect(k8sClient.Get(ctx, types.NamespacedName{Name: nbresource.Status.PolicyNameMapping[policyGenName]}, nbPolicy)).To(Succeed()) Expect(k8sClient.Get(ctx, types.NamespacedName{Name: nbresource.Status.PolicyNameMapping[policyGenName]}, nbPolicy)).To(Succeed())
Expect(nbPolicy.Status.ManagedServiceList).To(ContainElement("default/test-resource")) Expect(nbPolicy.Status.ManagedServiceList).To(ContainElement("default/test-resource"))
Expect(nbPolicy.Spec.Name).To(Equal("UnitTest")) Expect(nbPolicy.Spec.Name).To(Equal("UnitTest"))
@@ -495,11 +495,11 @@ var _ = Describe("NBResource Controller", func() {
When("Policy already exists", func() { When("Policy already exists", func() {
It("should update it", func() { It("should update it", func() {
nbPolicy := &netbirdiov1.NBPolicy{ nbPolicy := &nbv1.NBPolicy{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "test-gen-default-test-resource", Name: "test-gen-default-test-resource",
}, },
Spec: netbirdiov1.NBPolicySpec{ Spec: nbv1.NBPolicySpec{
Name: "Test", Name: "Test",
Description: "Test", Description: "Test",
SourceGroups: []string{"toast"}, SourceGroups: []string{"toast"},
@@ -520,7 +520,7 @@ var _ = Describe("NBResource Controller", func() {
Expect(k8sClient.Get(ctx, typeNamespacedName, nbresource)).To(Succeed()) Expect(k8sClient.Get(ctx, typeNamespacedName, nbresource)).To(Succeed())
Expect(nbresource.Status.PolicyNameMapping).To(HaveKey(policyGenName)) Expect(nbresource.Status.PolicyNameMapping).To(HaveKey(policyGenName))
nbPolicy = &netbirdiov1.NBPolicy{} nbPolicy = &nbv1.NBPolicy{}
Expect(k8sClient.Get(ctx, types.NamespacedName{Name: nbresource.Status.PolicyNameMapping[policyGenName]}, nbPolicy)).To(Succeed()) Expect(k8sClient.Get(ctx, types.NamespacedName{Name: nbresource.Status.PolicyNameMapping[policyGenName]}, nbPolicy)).To(Succeed())
Expect(nbPolicy.Status.ManagedServiceList).To(ContainElement("default/test-resource")) Expect(nbPolicy.Status.ManagedServiceList).To(ContainElement("default/test-resource"))
Expect(nbPolicy.Spec.Name).To(Equal("Autogenerated policy for resource default/test-resource in cluster kubernetes")) Expect(nbPolicy.Spec.Name).To(Equal("Autogenerated policy for resource default/test-resource in cluster kubernetes"))
@@ -552,7 +552,7 @@ var _ = Describe("NBResource Controller", func() {
Expect(k8sClient.Get(ctx, typeNamespacedName, nbresource)).To(Succeed()) Expect(k8sClient.Get(ctx, typeNamespacedName, nbresource)).To(Succeed())
Expect(nbresource.Status.PolicyNameMapping).To(HaveKey(policyGenName)) Expect(nbresource.Status.PolicyNameMapping).To(HaveKey(policyGenName))
nbPolicy := &netbirdiov1.NBPolicy{} nbPolicy := &nbv1.NBPolicy{}
Expect(k8sClient.Get(ctx, types.NamespacedName{Name: nbresource.Status.PolicyNameMapping[policyGenName]}, nbPolicy)).To(Succeed()) Expect(k8sClient.Get(ctx, types.NamespacedName{Name: nbresource.Status.PolicyNameMapping[policyGenName]}, nbPolicy)).To(Succeed())
Expect(nbPolicy.Status.ManagedServiceList).To(ContainElement("default/test-resource")) Expect(nbPolicy.Status.ManagedServiceList).To(ContainElement("default/test-resource"))
Expect(nbPolicy.Spec.Name).To(Equal("UnitTest")) Expect(nbPolicy.Spec.Name).To(Equal("UnitTest"))
@@ -573,7 +573,7 @@ var _ = Describe("NBResource Controller", func() {
Expect(k8sClient.Get(ctx, typeNamespacedName, nbresource)).To(Succeed()) Expect(k8sClient.Get(ctx, typeNamespacedName, nbresource)).To(Succeed())
Expect(nbresource.Status.PolicyNameMapping).To(HaveKey(policyGenName)) Expect(nbresource.Status.PolicyNameMapping).To(HaveKey(policyGenName))
nbPolicy := &netbirdiov1.NBPolicy{} nbPolicy := &nbv1.NBPolicy{}
Expect(k8sClient.Get(ctx, types.NamespacedName{Name: nbresource.Status.PolicyNameMapping[policyGenName]}, nbPolicy)).To(Succeed()) Expect(k8sClient.Get(ctx, types.NamespacedName{Name: nbresource.Status.PolicyNameMapping[policyGenName]}, nbPolicy)).To(Succeed())
nbPolicy.Spec.Name = "Meow" nbPolicy.Spec.Name = "Meow"
nbPolicy.Annotations = nil nbPolicy.Annotations = nil
@@ -607,7 +607,7 @@ var _ = Describe("NBResource Controller", func() {
Expect(k8sClient.Get(ctx, typeNamespacedName, nbresource)).To(Succeed()) Expect(k8sClient.Get(ctx, typeNamespacedName, nbresource)).To(Succeed())
Expect(nbresource.Status.PolicyNameMapping).To(HaveKey(policyGenName)) Expect(nbresource.Status.PolicyNameMapping).To(HaveKey(policyGenName))
nbPolicy := &netbirdiov1.NBPolicy{} nbPolicy := &nbv1.NBPolicy{}
Expect(k8sClient.Get(ctx, types.NamespacedName{Name: nbresource.Status.PolicyNameMapping[policyGenName]}, nbPolicy)).To(Succeed()) Expect(k8sClient.Get(ctx, types.NamespacedName{Name: nbresource.Status.PolicyNameMapping[policyGenName]}, nbPolicy)).To(Succeed())
nbresource.Spec.PolicyName = "" nbresource.Spec.PolicyName = ""
Expect(k8sClient.Update(ctx, nbresource)).To(Succeed()) Expect(k8sClient.Update(ctx, nbresource)).To(Succeed())
@@ -626,33 +626,33 @@ var _ = Describe("NBResource Controller", func() {
When("Multiple Policies are specified", Ordered, func() { When("Multiple Policies are specified", Ordered, func() {
BeforeAll(func() { BeforeAll(func() {
nbPolicy := &netbirdiov1.NBPolicy{ nbPolicy := &nbv1.NBPolicy{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "test-a", Name: "test-a",
}, },
Spec: netbirdiov1.NBPolicySpec{ Spec: nbv1.NBPolicySpec{
Name: "Test A", Name: "Test A",
SourceGroups: []string{"All"}, SourceGroups: []string{"All"},
}, },
} }
Expect(k8sClient.Create(ctx, nbPolicy)).To(Succeed()) Expect(k8sClient.Create(ctx, nbPolicy)).To(Succeed())
nbPolicy = &netbirdiov1.NBPolicy{ nbPolicy = &nbv1.NBPolicy{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "test-b", Name: "test-b",
}, },
Spec: netbirdiov1.NBPolicySpec{ Spec: nbv1.NBPolicySpec{
Name: "Test B", Name: "Test B",
SourceGroups: []string{"All"}, SourceGroups: []string{"All"},
}, },
} }
Expect(k8sClient.Create(ctx, nbPolicy)).To(Succeed()) Expect(k8sClient.Create(ctx, nbPolicy)).To(Succeed())
nbPolicy = &netbirdiov1.NBPolicy{ nbPolicy = &nbv1.NBPolicy{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "test-c", Name: "test-c",
}, },
Spec: netbirdiov1.NBPolicySpec{ Spec: nbv1.NBPolicySpec{
Name: "Test C", Name: "Test C",
SourceGroups: []string{"All"}, SourceGroups: []string{"All"},
}, },
@@ -661,19 +661,19 @@ var _ = Describe("NBResource Controller", func() {
}) })
AfterAll(func() { AfterAll(func() {
nbPolicy := &netbirdiov1.NBPolicy{} nbPolicy := &nbv1.NBPolicy{}
err := k8sClient.Get(ctx, types.NamespacedName{Name: "test-a"}, nbPolicy) err := k8sClient.Get(ctx, types.NamespacedName{Name: "test-a"}, nbPolicy)
if !errors.IsNotFound(err) { if !errors.IsNotFound(err) {
Expect(k8sClient.Delete(ctx, nbPolicy)).To(Succeed()) Expect(k8sClient.Delete(ctx, nbPolicy)).To(Succeed())
} }
nbPolicy = &netbirdiov1.NBPolicy{} nbPolicy = &nbv1.NBPolicy{}
err = k8sClient.Get(ctx, types.NamespacedName{Name: "test-b"}, nbPolicy) err = k8sClient.Get(ctx, types.NamespacedName{Name: "test-b"}, nbPolicy)
if !errors.IsNotFound(err) { if !errors.IsNotFound(err) {
Expect(k8sClient.Delete(ctx, nbPolicy)).To(Succeed()) Expect(k8sClient.Delete(ctx, nbPolicy)).To(Succeed())
} }
nbPolicy = &netbirdiov1.NBPolicy{} nbPolicy = &nbv1.NBPolicy{}
err = k8sClient.Get(ctx, types.NamespacedName{Name: "test-c"}, nbPolicy) err = k8sClient.Get(ctx, types.NamespacedName{Name: "test-c"}, nbPolicy)
if !errors.IsNotFound(err) { if !errors.IsNotFound(err) {
Expect(k8sClient.Delete(ctx, nbPolicy)).To(Succeed()) Expect(k8sClient.Delete(ctx, nbPolicy)).To(Succeed())
@@ -689,11 +689,11 @@ var _ = Describe("NBResource Controller", func() {
}) })
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
nbPolicy := &netbirdiov1.NBPolicy{} nbPolicy := &nbv1.NBPolicy{}
Expect(k8sClient.Get(ctx, types.NamespacedName{Name: "test-a"}, nbPolicy)).To(Succeed()) Expect(k8sClient.Get(ctx, types.NamespacedName{Name: "test-a"}, nbPolicy)).To(Succeed())
Expect(nbPolicy.Status.ManagedServiceList).To(ContainElement("default/test-resource")) Expect(nbPolicy.Status.ManagedServiceList).To(ContainElement("default/test-resource"))
nbPolicy = &netbirdiov1.NBPolicy{} nbPolicy = &nbv1.NBPolicy{}
Expect(k8sClient.Get(ctx, types.NamespacedName{Name: "test-b"}, nbPolicy)).To(Succeed()) Expect(k8sClient.Get(ctx, types.NamespacedName{Name: "test-b"}, nbPolicy)).To(Succeed())
Expect(nbPolicy.Status.ManagedServiceList).To(ContainElement("default/test-resource")) Expect(nbPolicy.Status.ManagedServiceList).To(ContainElement("default/test-resource"))
}) })
@@ -711,15 +711,15 @@ var _ = Describe("NBResource Controller", func() {
}) })
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
nbPolicy := &netbirdiov1.NBPolicy{} nbPolicy := &nbv1.NBPolicy{}
Expect(k8sClient.Get(ctx, types.NamespacedName{Name: "test-a"}, nbPolicy)).To(Succeed()) Expect(k8sClient.Get(ctx, types.NamespacedName{Name: "test-a"}, nbPolicy)).To(Succeed())
Expect(nbPolicy.Status.ManagedServiceList).NotTo(ContainElement("default/test-resource")) Expect(nbPolicy.Status.ManagedServiceList).NotTo(ContainElement("default/test-resource"))
nbPolicy = &netbirdiov1.NBPolicy{} nbPolicy = &nbv1.NBPolicy{}
Expect(k8sClient.Get(ctx, types.NamespacedName{Name: "test-b"}, nbPolicy)).To(Succeed()) Expect(k8sClient.Get(ctx, types.NamespacedName{Name: "test-b"}, nbPolicy)).To(Succeed())
Expect(nbPolicy.Status.ManagedServiceList).To(ContainElement("default/test-resource")) Expect(nbPolicy.Status.ManagedServiceList).To(ContainElement("default/test-resource"))
nbPolicy = &netbirdiov1.NBPolicy{} nbPolicy = &nbv1.NBPolicy{}
Expect(k8sClient.Get(ctx, types.NamespacedName{Name: "test-c"}, nbPolicy)).To(Succeed()) Expect(k8sClient.Get(ctx, types.NamespacedName{Name: "test-c"}, nbPolicy)).To(Succeed())
Expect(nbPolicy.Status.ManagedServiceList).To(ContainElement("default/test-resource")) Expect(nbPolicy.Status.ManagedServiceList).To(ContainElement("default/test-resource"))
}) })
@@ -738,15 +738,15 @@ var _ = Describe("NBResource Controller", func() {
}) })
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
nbPolicy := &netbirdiov1.NBPolicy{} nbPolicy := &nbv1.NBPolicy{}
Expect(k8sClient.Get(ctx, types.NamespacedName{Name: "test-a"}, nbPolicy)).To(Succeed()) Expect(k8sClient.Get(ctx, types.NamespacedName{Name: "test-a"}, nbPolicy)).To(Succeed())
Expect(nbPolicy.Status.ManagedServiceList).NotTo(ContainElement("default/test-resource")) Expect(nbPolicy.Status.ManagedServiceList).NotTo(ContainElement("default/test-resource"))
nbPolicy = &netbirdiov1.NBPolicy{} nbPolicy = &nbv1.NBPolicy{}
Expect(k8sClient.Get(ctx, types.NamespacedName{Name: "test-b"}, nbPolicy)).To(Succeed()) Expect(k8sClient.Get(ctx, types.NamespacedName{Name: "test-b"}, nbPolicy)).To(Succeed())
Expect(nbPolicy.Status.ManagedServiceList).NotTo(ContainElement("default/test-resource")) Expect(nbPolicy.Status.ManagedServiceList).NotTo(ContainElement("default/test-resource"))
nbPolicy = &netbirdiov1.NBPolicy{} nbPolicy = &nbv1.NBPolicy{}
Expect(k8sClient.Get(ctx, types.NamespacedName{Name: "test-c"}, nbPolicy)).To(Succeed()) Expect(k8sClient.Get(ctx, types.NamespacedName{Name: "test-c"}, nbPolicy)).To(Succeed())
Expect(nbPolicy.Status.ManagedServiceList).NotTo(ContainElement("default/test-resource")) Expect(nbPolicy.Status.ManagedServiceList).NotTo(ContainElement("default/test-resource"))
}) })
@@ -764,7 +764,7 @@ var _ = Describe("NBResource Controller", func() {
}) })
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
nbGroup := &netbirdiov1.NBGroup{} nbGroup := &nbv1.NBGroup{}
Expect(k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "meow"}, nbGroup)).To(Succeed()) Expect(k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "meow"}, nbGroup)).To(Succeed())
Expect(nbGroup.Finalizers).To(BeEmpty()) Expect(nbGroup.Finalizers).To(BeEmpty())
Expect(nbGroup.OwnerReferences).To(HaveLen(1)) Expect(nbGroup.OwnerReferences).To(HaveLen(1))
@@ -773,12 +773,12 @@ var _ = Describe("NBResource Controller", func() {
When("Removed groups are referenced by something else", func() { When("Removed groups are referenced by something else", func() {
BeforeEach(func() { BeforeEach(func() {
otherResource := &netbirdiov1.NBResource{ otherResource := &nbv1.NBResource{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "not-test", Name: "not-test",
Namespace: "default", Namespace: "default",
}, },
Spec: netbirdiov1.NBResourceSpec{ Spec: nbv1.NBResourceSpec{
Name: "nottest", Name: "nottest",
NetworkID: "test", NetworkID: "test",
Address: "test", Address: "test",
@@ -787,7 +787,7 @@ var _ = Describe("NBResource Controller", func() {
} }
Expect(k8sClient.Create(ctx, otherResource)).To(Succeed()) Expect(k8sClient.Create(ctx, otherResource)).To(Succeed())
nbGroup := &netbirdiov1.NBGroup{} nbGroup := &nbv1.NBGroup{}
Expect(k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "meow"}, nbGroup)).To(Succeed()) Expect(k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "meow"}, nbGroup)).To(Succeed())
nbGroup.OwnerReferences = append(nbGroup.OwnerReferences, metav1.OwnerReference{ nbGroup.OwnerReferences = append(nbGroup.OwnerReferences, metav1.OwnerReference{
APIVersion: "netbird.io/v1", APIVersion: "netbird.io/v1",
@@ -799,7 +799,7 @@ var _ = Describe("NBResource Controller", func() {
}) })
AfterEach(func() { AfterEach(func() {
otherResource := &netbirdiov1.NBResource{} otherResource := &nbv1.NBResource{}
Expect(k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "not-test"}, otherResource)).To(Succeed()) Expect(k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "not-test"}, otherResource)).To(Succeed())
Expect(k8sClient.Delete(ctx, otherResource)).To(Succeed()) Expect(k8sClient.Delete(ctx, otherResource)).To(Succeed())
}) })
@@ -813,7 +813,7 @@ var _ = Describe("NBResource Controller", func() {
}) })
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
nbGroup := &netbirdiov1.NBGroup{} nbGroup := &nbv1.NBGroup{}
Expect(k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "meow"}, nbGroup)).To(Succeed()) Expect(k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "meow"}, nbGroup)).To(Succeed())
Expect(nbGroup.Finalizers).To(HaveLen(1)) Expect(nbGroup.Finalizers).To(HaveLen(1))
Expect(nbGroup.OwnerReferences).To(HaveLen(1)) Expect(nbGroup.OwnerReferences).To(HaveLen(1))
@@ -830,7 +830,7 @@ var _ = Describe("NBResource Controller", func() {
}) })
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
nbGroup := &netbirdiov1.NBGroup{} nbGroup := &nbv1.NBGroup{}
Expect(k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "meow3"}, nbGroup)).To(Succeed()) Expect(k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "meow3"}, nbGroup)).To(Succeed())
Expect(nbGroup.OwnerReferences).To(HaveLen(1)) Expect(nbGroup.OwnerReferences).To(HaveLen(1))
Expect(nbGroup.Finalizers).To(ConsistOf([]string{"netbird.io/group-cleanup", "netbird.io/resource-cleanup"})) Expect(nbGroup.Finalizers).To(ConsistOf([]string{"netbird.io/group-cleanup", "netbird.io/resource-cleanup"}))
@@ -872,11 +872,11 @@ var _ = Describe("NBResource Controller", func() {
nbresource.Status.NetworkResourceID = util.Ptr("test") nbresource.Status.NetworkResourceID = util.Ptr("test")
Expect(k8sClient.Status().Update(ctx, nbresource)).To(Succeed()) Expect(k8sClient.Status().Update(ctx, nbresource)).To(Succeed())
nbPolicy := &netbirdiov1.NBPolicy{ nbPolicy := &nbv1.NBPolicy{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "test", Name: "test",
}, },
Spec: netbirdiov1.NBPolicySpec{ Spec: nbv1.NBPolicySpec{
Name: "Test", Name: "Test",
SourceGroups: []string{"All"}, SourceGroups: []string{"All"},
Bidirectional: true, Bidirectional: true,
@@ -887,32 +887,32 @@ var _ = Describe("NBResource Controller", func() {
nbPolicy.Status.ManagedServiceList = []string{"default/test-resource"} nbPolicy.Status.ManagedServiceList = []string{"default/test-resource"}
Expect(k8sClient.Status().Update(ctx, nbPolicy)).To(Succeed()) Expect(k8sClient.Status().Update(ctx, nbPolicy)).To(Succeed())
nbGroup := &netbirdiov1.NBGroup{ nbGroup := &nbv1.NBGroup{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "meow", Name: "meow",
Namespace: "default", Namespace: "default",
Finalizers: []string{"netbird.io/resource-cleanup"}, Finalizers: []string{"netbird.io/resource-cleanup"},
OwnerReferences: []metav1.OwnerReference{ OwnerReferences: []metav1.OwnerReference{
{ {
APIVersion: netbirdiov1.GroupVersion.Identifier(), APIVersion: nbv1.GroupVersion.Identifier(),
Kind: "NBResource", Kind: "NBResource",
Name: nbresource.Name, Name: nbresource.Name,
UID: nbresource.UID, UID: nbresource.UID,
}, },
}, },
}, },
Spec: netbirdiov1.NBGroupSpec{ Spec: nbv1.NBGroupSpec{
Name: "meow", Name: "meow",
}, },
} }
Expect(k8sClient.Create(ctx, nbGroup)).To(Succeed()) Expect(k8sClient.Create(ctx, nbGroup)).To(Succeed())
othernbresource := &netbirdiov1.NBResource{ othernbresource := &nbv1.NBResource{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "other-resource", Name: "other-resource",
Namespace: "default", Namespace: "default",
}, },
Spec: netbirdiov1.NBResourceSpec{ Spec: nbv1.NBResourceSpec{
Name: "test", Name: "test",
NetworkID: "test", NetworkID: "test",
Address: "test", Address: "test",
@@ -921,34 +921,34 @@ var _ = Describe("NBResource Controller", func() {
} }
Expect(k8sClient.Create(ctx, othernbresource)).To(Succeed()) Expect(k8sClient.Create(ctx, othernbresource)).To(Succeed())
nbGroup = &netbirdiov1.NBGroup{ nbGroup = &nbv1.NBGroup{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "meowdelete", Name: "meowdelete",
Namespace: "default", Namespace: "default",
Finalizers: []string{"netbird.io/resource-cleanup"}, Finalizers: []string{"netbird.io/resource-cleanup"},
OwnerReferences: []metav1.OwnerReference{ OwnerReferences: []metav1.OwnerReference{
{ {
APIVersion: netbirdiov1.GroupVersion.Identifier(), APIVersion: nbv1.GroupVersion.Identifier(),
Kind: "NBResource", Kind: "NBResource",
Name: nbresource.Name, Name: nbresource.Name,
UID: nbresource.UID, UID: nbresource.UID,
}, },
{ {
APIVersion: netbirdiov1.GroupVersion.Identifier(), APIVersion: nbv1.GroupVersion.Identifier(),
Kind: "NBResource", Kind: "NBResource",
Name: othernbresource.Name, Name: othernbresource.Name,
UID: othernbresource.UID, UID: othernbresource.UID,
}, },
}, },
}, },
Spec: netbirdiov1.NBGroupSpec{ Spec: nbv1.NBGroupSpec{
Name: "meow", Name: "meow",
}, },
} }
Expect(k8sClient.Create(ctx, nbGroup)).To(Succeed()) Expect(k8sClient.Create(ctx, nbGroup)).To(Succeed())
}) })
AfterAll(func() { AfterAll(func() {
policy := &netbirdiov1.NBPolicy{} policy := &nbv1.NBPolicy{}
err := k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "test"}, policy) err := k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "test"}, policy)
if !errors.IsNotFound(err) { if !errors.IsNotFound(err) {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
@@ -961,7 +961,7 @@ var _ = Describe("NBResource Controller", func() {
Expect(k8sClient.Delete(ctx, policy)).To(Succeed()) Expect(k8sClient.Delete(ctx, policy)).To(Succeed())
} }
resource := &netbirdiov1.NBResource{} resource := &nbv1.NBResource{}
err = k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "other-resource"}, resource) err = k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "other-resource"}, resource)
if !errors.IsNotFound(err) { if !errors.IsNotFound(err) {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
@@ -974,7 +974,7 @@ var _ = Describe("NBResource Controller", func() {
Expect(k8sClient.Delete(ctx, resource)).To(Succeed()) Expect(k8sClient.Delete(ctx, resource)).To(Succeed())
} }
group := &netbirdiov1.NBGroup{} group := &nbv1.NBGroup{}
err = k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "meow"}, group) err = k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "meow"}, group)
if !errors.IsNotFound(err) { if !errors.IsNotFound(err) {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
@@ -987,7 +987,7 @@ var _ = Describe("NBResource Controller", func() {
Expect(k8sClient.Delete(ctx, group)).To(Succeed()) Expect(k8sClient.Delete(ctx, group)).To(Succeed())
} }
group = &netbirdiov1.NBGroup{} group = &nbv1.NBGroup{}
err = k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "meowdelete"}, group) err = k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "meowdelete"}, group)
if !errors.IsNotFound(err) { if !errors.IsNotFound(err) {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
@@ -1022,7 +1022,7 @@ var _ = Describe("NBResource Controller", func() {
Expect(errors.IsNotFound(err)).To(BeTrue()) Expect(errors.IsNotFound(err)).To(BeTrue())
}) })
It("should remove resource cleanup finalizer from solely-owned NBGroups", func() { It("should remove resource cleanup finalizer from solely-owned NBGroups", func() {
group := &netbirdiov1.NBGroup{} group := &nbv1.NBGroup{}
err := k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "meow"}, group) err := k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "meow"}, group)
if errors.IsNotFound(err) { if errors.IsNotFound(err) {
return return
@@ -1030,13 +1030,13 @@ var _ = Describe("NBResource Controller", func() {
Expect(group.Finalizers).To(BeEmpty()) Expect(group.Finalizers).To(BeEmpty())
}) })
It("should remove owner reference from shared NBGroups", func() { It("should remove owner reference from shared NBGroups", func() {
group := &netbirdiov1.NBGroup{} group := &nbv1.NBGroup{}
Expect(k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "meowdelete"}, group)).To(Succeed()) Expect(k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "meowdelete"}, group)).To(Succeed())
Expect(group.Finalizers).To(HaveLen(1)) Expect(group.Finalizers).To(HaveLen(1))
Expect(group.OwnerReferences).To(HaveLen(1)) Expect(group.OwnerReferences).To(HaveLen(1))
}) })
It("should remove policy reference", func() { It("should remove policy reference", func() {
policy := &netbirdiov1.NBPolicy{} policy := &nbv1.NBPolicy{}
Expect(k8sClient.Get(ctx, types.NamespacedName{Name: "test"}, policy)).To(Succeed()) Expect(k8sClient.Get(ctx, types.NamespacedName{Name: "test"}, policy)).To(Succeed())
Expect(policy.Status.ManagedServiceList).NotTo(ContainElement("default/test-resource")) Expect(policy.Status.ManagedServiceList).NotTo(ContainElement("default/test-resource"))
}) })
+54 -53
View File
@@ -8,19 +8,20 @@ import (
"strings" "strings"
"time" "time"
"github.com/go-logr/logr"
appsv1 "k8s.io/api/apps/v1" appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1" corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/errors" "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" ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/handler" "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" netbird "github.com/netbirdio/netbird/shared/management/client/rest"
"github.com/netbirdio/netbird/shared/management/http/api" "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 // 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 := ctrl.Log.WithName("NBRoutingPeer").WithValues("namespace", req.Namespace, "name", req.Name)
logger.Info("Reconciling NBRoutingPeer") logger.Info("Reconciling NBRoutingPeer")
nbrp := &netbirdiov1.NBRoutingPeer{} nbrp := &nbv1.NBRoutingPeer{}
err = r.Get(ctx, req.NamespacedName, nbrp) err = r.Get(ctx, req.NamespacedName, nbrp)
if err != nil { if err != nil {
if !errors.IsNotFound(err) { if !errors.IsNotFound(err) {
@@ -109,17 +110,17 @@ func (r *NBRoutingPeerReconciler) Reconcile(ctx context.Context, req ctrl.Reques
return ctrl.Result{}, err return ctrl.Result{}, err
} }
nbrp.Status.Conditions = netbirdiov1.NBConditionTrue() nbrp.Status.Conditions = nbv1.NBConditionTrue()
return ctrl.Result{}, nil return ctrl.Result{}, nil
} }
// handleDeployment reconcile routing peer Deployment // 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{} routingPeerDeployment := appsv1.Deployment{}
err := r.Client.Get(ctx, req.NamespacedName, &routingPeerDeployment) err := r.Client.Get(ctx, req.NamespacedName, &routingPeerDeployment)
if err != nil && !errors.IsNotFound(err) { if err != nil && !errors.IsNotFound(err) {
logger.Error(errKubernetesAPI, "error getting Deployment", "err", 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 return err
} }
@@ -135,12 +136,12 @@ func (r *NBRoutingPeerReconciler) handleDeployment(ctx context.Context, req ctrl
replicas = *nbrp.Spec.Replicas replicas = *nbrp.Spec.Replicas
} }
routingPeerDeployment = appsv1.Deployment{ routingPeerDeployment = appsv1.Deployment{
ObjectMeta: v1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: nbrp.Name, Name: nbrp.Name,
Namespace: nbrp.Namespace, Namespace: nbrp.Namespace,
OwnerReferences: []v1.OwnerReference{ OwnerReferences: []metav1.OwnerReference{
{ {
APIVersion: netbirdiov1.GroupVersion.Identifier(), APIVersion: nbv1.GroupVersion.Identifier(),
Kind: "NBRoutingPeer", Kind: "NBRoutingPeer",
Name: nbrp.Name, Name: nbrp.Name,
UID: nbrp.UID, UID: nbrp.UID,
@@ -152,13 +153,13 @@ func (r *NBRoutingPeerReconciler) handleDeployment(ctx context.Context, req ctrl
}, },
Spec: appsv1.DeploymentSpec{ Spec: appsv1.DeploymentSpec{
Replicas: &replicas, Replicas: &replicas,
Selector: &v1.LabelSelector{ Selector: &metav1.LabelSelector{
MatchLabels: map[string]string{ MatchLabels: map[string]string{
"app.kubernetes.io/name": "netbird-router", "app.kubernetes.io/name": "netbird-router",
}, },
}, },
Template: corev1.PodTemplateSpec{ Template: corev1.PodTemplateSpec{
ObjectMeta: v1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Labels: podLabels, Labels: podLabels,
}, },
Spec: corev1.PodSpec{ Spec: corev1.PodSpec{
@@ -199,16 +200,16 @@ func (r *NBRoutingPeerReconciler) handleDeployment(ctx context.Context, req ctrl
err = r.Client.Create(ctx, &routingPeerDeployment) err = r.Client.Create(ctx, &routingPeerDeployment)
if err != nil { if err != nil {
logger.Error(errKubernetesAPI, "error creating Deployment", "err", err) 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 return err
} }
} else if err == nil { } else if err == nil {
updatedDeployment := routingPeerDeployment.DeepCopy() updatedDeployment := routingPeerDeployment.DeepCopy()
updatedDeployment.ObjectMeta.Name = nbrp.Name updatedDeployment.ObjectMeta.Name = nbrp.Name
updatedDeployment.ObjectMeta.Namespace = nbrp.Namespace 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", Kind: "NBRoutingPeer",
Name: nbrp.Name, Name: nbrp.Name,
UID: nbrp.UID, UID: nbrp.UID,
@@ -224,7 +225,7 @@ func (r *NBRoutingPeerReconciler) handleDeployment(ctx context.Context, req ctrl
replicas = *nbrp.Spec.Replicas replicas = *nbrp.Spec.Replicas
} }
updatedDeployment.Spec.Replicas = &replicas updatedDeployment.Spec.Replicas = &replicas
updatedDeployment.Spec.Selector = &v1.LabelSelector{ updatedDeployment.Spec.Selector = &metav1.LabelSelector{
MatchLabels: map[string]string{ MatchLabels: map[string]string{
"app.kubernetes.io/name": "netbird-router", "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) err = r.Client.Patch(ctx, updatedDeployment, patch)
if err != nil { if err != nil {
logger.Error(errKubernetesAPI, "error updating Deployment", "err", err) 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 return err
} }
} }
@@ -278,13 +279,13 @@ func (r *NBRoutingPeerReconciler) handleDeployment(ctx context.Context, req ctrl
} }
// handleRouter reconcile network routing peer in NetBird management API // 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 // Check NetworkRouter exists
routers, err := r.Netbird.Networks.Routers(*nbrp.Status.NetworkID).List(ctx) routers, err := r.Netbird.Networks.Routers(*nbrp.Status.NetworkID).List(ctx)
if err != nil { if err != nil {
logger.Error(errNetBirdAPI, "error listing network routers", "err", err) 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 return err
} }
@@ -303,7 +304,7 @@ func (r *NBRoutingPeerReconciler) handleRouter(ctx context.Context, nbrp *netbir
if err != nil { if err != nil {
logger.Error(errNetBirdAPI, "error creating network router", "err", err) 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 return err
} }
@@ -321,7 +322,7 @@ func (r *NBRoutingPeerReconciler) handleRouter(ctx context.Context, nbrp *netbir
if err != nil { if err != nil {
logger.Error(errNetBirdAPI, "error updating network router", "err", err) 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 return err
} }
} }
@@ -331,7 +332,7 @@ func (r *NBRoutingPeerReconciler) handleRouter(ctx context.Context, nbrp *netbir
} }
// handleSetupKey reconcile setup key and regenerate if invalid // 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 networkName := r.ClusterName
if r.NamespacedNetworks { if r.NamespacedNetworks {
networkName += "-" + req.Namespace networkName += "-" + req.Namespace
@@ -349,19 +350,19 @@ func (r *NBRoutingPeerReconciler) handleSetupKey(ctx context.Context, req ctrl.R
if err != nil { if err != nil {
logger.Error(errNetBirdAPI, "error creating setup key", "err", err) 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 return &ctrl.Result{}, err
} }
nbrp.Status.SetupKeyID = &setupKey.Id nbrp.Status.SetupKeyID = &setupKey.Id
skSecret := corev1.Secret{ skSecret := corev1.Secret{
ObjectMeta: v1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: nbrp.Name, Name: nbrp.Name,
Namespace: nbrp.Namespace, Namespace: nbrp.Namespace,
OwnerReferences: []v1.OwnerReference{ OwnerReferences: []metav1.OwnerReference{
{ {
APIVersion: netbirdiov1.GroupVersion.Identifier(), APIVersion: nbv1.GroupVersion.Identifier(),
Kind: "NBRoutingPeer", Kind: "NBRoutingPeer",
Name: nbrp.Name, Name: nbrp.Name,
UID: nbrp.UID, UID: nbrp.UID,
@@ -389,7 +390,7 @@ func (r *NBRoutingPeerReconciler) handleSetupKey(ctx context.Context, req ctrl.R
if err != nil { if err != nil {
logger.Error(errKubernetesAPI, "error creating Secret", "err", err) 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 return &ctrl.Result{}, err
} }
} else { } 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) setupKey, err := r.Netbird.SetupKeys.Get(ctx, *nbrp.Status.SetupKeyID)
if err != nil && !strings.Contains(err.Error(), "not found") { if err != nil && !strings.Contains(err.Error(), "not found") {
logger.Error(errNetBirdAPI, "error getting setup key", "err", err) 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 return &ctrl.Result{}, err
} }
@@ -407,7 +408,7 @@ func (r *NBRoutingPeerReconciler) handleSetupKey(ctx context.Context, req ctrl.R
if err != nil { if err != nil {
logger.Error(errNetBirdAPI, "error deleting setup key", "err", err) 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 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) err = r.Client.Get(ctx, req.NamespacedName, &skSecret)
if err != nil && !errors.IsNotFound(err) { if err != nil && !errors.IsNotFound(err) {
logger.Error(errKubernetesAPI, "error getting Secret", "err", 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 return &ctrl.Result{}, err
} }
@@ -433,13 +434,13 @@ func (r *NBRoutingPeerReconciler) handleSetupKey(ctx context.Context, req ctrl.R
if err != nil { if err != nil {
logger.Error(errNetBirdAPI, "error deleting setup key", "err", err) 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 return &ctrl.Result{}, err
} }
nbrp.Status.SetupKeyID = nil 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 // Requeue to avoid repeating code
return &ctrl.Result{Requeue: true}, nil 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 // 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 networkName := r.ClusterName
if r.NamespacedNetworks { if r.NamespacedNetworks {
networkName += "-" + req.Namespace networkName += "-" + req.Namespace
} }
// Check if NetBird Group exists // Check if NetBird Group exists
nbGroup := netbirdiov1.NBGroup{} nbGroup := nbv1.NBGroup{}
err := r.Client.Get(ctx, req.NamespacedName, &nbGroup) err := r.Client.Get(ctx, req.NamespacedName, &nbGroup)
if err != nil && !errors.IsNotFound(err) { if err != nil && !errors.IsNotFound(err) {
logger.Error(errKubernetesAPI, "error getting NBGroup", "err", 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 return nil, &ctrl.Result{}, err
} }
if errors.IsNotFound(err) { if errors.IsNotFound(err) {
nbGroup = netbirdiov1.NBGroup{ nbGroup = nbv1.NBGroup{
ObjectMeta: v1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: nbrp.Name, Name: nbrp.Name,
Namespace: nbrp.Namespace, Namespace: nbrp.Namespace,
OwnerReferences: []v1.OwnerReference{ OwnerReferences: []metav1.OwnerReference{
{ {
APIVersion: netbirdiov1.GroupVersion.Identifier(), APIVersion: nbv1.GroupVersion.Identifier(),
Kind: "NBRoutingPeer", Kind: "NBRoutingPeer",
Name: nbrp.Name, Name: nbrp.Name,
UID: nbrp.UID, 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"}, Finalizers: []string{"netbird.io/group-cleanup", "netbird.io/routing-peer-cleanup"},
Labels: r.DefaultLabels, Labels: r.DefaultLabels,
}, },
Spec: netbirdiov1.NBGroupSpec{ Spec: nbv1.NBGroupSpec{
Name: networkName, Name: networkName,
}, },
} }
@@ -490,7 +491,7 @@ func (r *NBRoutingPeerReconciler) handleGroup(ctx context.Context, req ctrl.Requ
if err != nil { if err != nil {
logger.Error(errKubernetesAPI, "error creating NBGroup", "err", err) 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 return nil, &ctrl.Result{}, err
} }
@@ -507,7 +508,7 @@ func (r *NBRoutingPeerReconciler) handleGroup(ctx context.Context, req ctrl.Requ
} }
// handleNetwork Create/Update NetBird Network // 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 networkName := r.ClusterName
if r.NamespacedNetworks { if r.NamespacedNetworks {
networkName += "-" + req.Namespace networkName += "-" + req.Namespace
@@ -518,7 +519,7 @@ func (r *NBRoutingPeerReconciler) handleNetwork(ctx context.Context, req ctrl.Re
networks, err := r.Netbird.Networks.List(ctx) networks, err := r.Netbird.Networks.List(ctx)
if err != nil { if err != nil {
logger.Error(errNetBirdAPI, "error listing networks", "err", err) 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 return err
} }
var network *api.Network var network *api.Network
@@ -539,7 +540,7 @@ func (r *NBRoutingPeerReconciler) handleNetwork(ctx context.Context, req ctrl.Re
}) })
if err != nil { if err != nil {
logger.Error(errNetBirdAPI, "error creating network", "err", err) 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 return err
} }
@@ -549,7 +550,7 @@ func (r *NBRoutingPeerReconciler) handleNetwork(ctx context.Context, req ctrl.Re
return nil 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{} nbDeployment := appsv1.Deployment{}
err := r.Client.Get(ctx, req.NamespacedName, &nbDeployment) err := r.Client.Get(ctx, req.NamespacedName, &nbDeployment)
if err != nil && !errors.IsNotFound(err) { 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) logger.Info("Setup key deleted", "id", setupKeyID)
} }
nbGroup := netbirdiov1.NBGroup{} nbGroup := nbv1.NBGroup{}
err = r.Client.Get(ctx, req.NamespacedName, &nbGroup) err = r.Client.Get(ctx, req.NamespacedName, &nbGroup)
if err != nil && !errors.IsNotFound(err) { if err != nil && !errors.IsNotFound(err) {
logger.Error(errKubernetesAPI, "error getting NBGroup", "err", 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 { if nbrp.Status.NetworkID != nil {
nbResourceList := netbirdiov1.NBResourceList{} nbResourceList := nbv1.NBResourceList{}
err = r.Client.List(ctx, &nbResourceList) err = r.Client.List(ctx, &nbResourceList)
if err != nil { if err != nil {
logger.Error(errKubernetesAPI, "error listing NBResource", "err", err) 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 // 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{ securityContext := &corev1.SecurityContext{
Capabilities: &corev1.Capabilities{ Capabilities: &corev1.Capabilities{
Add: []corev1.Capability{ Add: []corev1.Capability{
@@ -664,10 +665,10 @@ func (r *NBRoutingPeerReconciler) buildSecurityContext(nbrp *netbirdiov1.NBRouti
// SetupWithManager sets up the controller with the Manager. // SetupWithManager sets up the controller with the Manager.
func (r *NBRoutingPeerReconciler) SetupWithManager(mgr ctrl.Manager) error { func (r *NBRoutingPeerReconciler) SetupWithManager(mgr ctrl.Manager) error {
return ctrl.NewControllerManagedBy(mgr). return ctrl.NewControllerManagedBy(mgr).
For(&netbirdiov1.NBRoutingPeer{}). For(&nbv1.NBRoutingPeer{}).
Named("nbroutingpeer"). Named("nbroutingpeer").
Watches(&appsv1.Deployment{}, 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(), &netbirdiov1.NBRoutingPeer{})). Watches(&corev1.Secret{}, handler.EnqueueRequestForOwner(mgr.GetScheme(), mgr.GetRESTMapper(), &nbv1.NBRoutingPeer{})).
Watches(&netbirdiov1.NBGroup{}, handler.EnqueueRequestForOwner(mgr.GetScheme(), mgr.GetRESTMapper(), &netbirdiov1.NBRoutingPeer{})). Watches(&nbv1.NBGroup{}, handler.EnqueueRequestForOwner(mgr.GetScheme(), mgr.GetRESTMapper(), &nbv1.NBRoutingPeer{})).
Complete(r) Complete(r)
} }
@@ -10,19 +10,19 @@ import (
"github.com/go-logr/logr" "github.com/go-logr/logr"
. "github.com/onsi/ginkgo/v2" . "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega" . "github.com/onsi/gomega"
appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/types"
ctrl "sigs.k8s.io/controller-runtime" ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/reconcile" "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" netbird "github.com/netbirdio/netbird/shared/management/client/rest"
"github.com/netbirdio/netbird/shared/management/http/api" "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() { var _ = Describe("NBRoutingPeer Controller", func() {
@@ -35,7 +35,7 @@ var _ = Describe("NBRoutingPeer Controller", func() {
Name: resourceName, Name: resourceName,
Namespace: "default", Namespace: "default",
} }
nbroutingpeer := &netbirdiov1.NBRoutingPeer{} nbroutingpeer := &nbv1.NBRoutingPeer{}
var netbirdClient *netbird.Client var netbirdClient *netbird.Client
var mux *http.ServeMux var mux *http.ServeMux
var server *httptest.Server var server *httptest.Server
@@ -58,13 +58,13 @@ var _ = Describe("NBRoutingPeer Controller", func() {
By("creating the custom resource for the Kind NBRoutingPeer") By("creating the custom resource for the Kind NBRoutingPeer")
err := k8sClient.Get(ctx, typeNamespacedName, nbroutingpeer) err := k8sClient.Get(ctx, typeNamespacedName, nbroutingpeer)
if err != nil && errors.IsNotFound(err) { if err != nil && errors.IsNotFound(err) {
nbroutingpeer = &netbirdiov1.NBRoutingPeer{ nbroutingpeer = &nbv1.NBRoutingPeer{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: resourceName, Name: resourceName,
Namespace: "default", Namespace: "default",
Finalizers: []string{"netbird.io/cleanup"}, Finalizers: []string{"netbird.io/cleanup"},
}, },
Spec: netbirdiov1.NBRoutingPeerSpec{ Spec: nbv1.NBRoutingPeerSpec{
Replicas: util.Ptr(int32(0)), Replicas: util.Ptr(int32(0)),
}, },
} }
@@ -73,7 +73,7 @@ var _ = Describe("NBRoutingPeer Controller", func() {
}) })
AfterEach(func() { AfterEach(func() {
resource := &netbirdiov1.NBRoutingPeer{} resource := &nbv1.NBRoutingPeer{}
err := k8sClient.Get(ctx, typeNamespacedName, resource) err := k8sClient.Get(ctx, typeNamespacedName, resource)
if !errors.IsNotFound(err) { if !errors.IsNotFound(err) {
Expect(err).NotTo(HaveOccurred()) 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) err = k8sClient.Get(ctx, typeNamespacedName, group)
if !errors.IsNotFound(err) { if !errors.IsNotFound(err) {
Expect(err).NotTo(HaveOccurred()) 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) err = k8sClient.Get(ctx, typeNamespacedName, nbresource)
if !errors.IsNotFound(err) { if !errors.IsNotFound(err) {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
@@ -156,12 +156,12 @@ var _ = Describe("NBRoutingPeer Controller", func() {
When("Network doesn't exist", func() { When("Network doesn't exist", func() {
BeforeEach(func() { BeforeEach(func() {
group := &netbirdiov1.NBGroup{ group := &nbv1.NBGroup{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: typeNamespacedName.Name, Name: typeNamespacedName.Name,
Namespace: typeNamespacedName.Namespace, Namespace: typeNamespacedName.Namespace,
}, },
Spec: netbirdiov1.NBGroupSpec{ Spec: nbv1.NBGroupSpec{
Name: controllerReconciler.ClusterName, Name: controllerReconciler.ClusterName,
}, },
} }
@@ -230,12 +230,12 @@ var _ = Describe("NBRoutingPeer Controller", func() {
}) })
Describe("Network Router changes", func() { Describe("Network Router changes", func() {
BeforeEach(func() { BeforeEach(func() {
group := &netbirdiov1.NBGroup{ group := &nbv1.NBGroup{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: typeNamespacedName.Name, Name: typeNamespacedName.Name,
Namespace: typeNamespacedName.Namespace, Namespace: typeNamespacedName.Namespace,
}, },
Spec: netbirdiov1.NBGroupSpec{ Spec: nbv1.NBGroupSpec{
Name: controllerReconciler.ClusterName, Name: controllerReconciler.ClusterName,
}, },
} }
@@ -445,7 +445,7 @@ var _ = Describe("NBRoutingPeer Controller", func() {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
Expect(res.RequeueAfter).To(BeNumerically(">", 0)) Expect(res.RequeueAfter).To(BeNumerically(">", 0))
group := &netbirdiov1.NBGroup{} group := &nbv1.NBGroup{}
Expect(k8sClient.Get(ctx, typeNamespacedName, group)).To(Succeed()) Expect(k8sClient.Get(ctx, typeNamespacedName, group)).To(Succeed())
Expect(group.Spec.Name).To(Equal(controllerReconciler.ClusterName)) Expect(group.Spec.Name).To(Equal(controllerReconciler.ClusterName))
Expect(group.Labels).To(HaveKeyWithValue("dog", "bark")) Expect(group.Labels).To(HaveKeyWithValue("dog", "bark"))
@@ -461,13 +461,13 @@ var _ = Describe("NBRoutingPeer Controller", func() {
}) })
When("Group exists", func() { When("Group exists", func() {
BeforeEach(func() { BeforeEach(func() {
group := &netbirdiov1.NBGroup{ group := &nbv1.NBGroup{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: typeNamespacedName.Name, Name: typeNamespacedName.Name,
Namespace: typeNamespacedName.Namespace, Namespace: typeNamespacedName.Namespace,
Finalizers: []string{"netbird.io/routing-peer-cleanup", "netbird.io/group-cleanup"}, Finalizers: []string{"netbird.io/routing-peer-cleanup", "netbird.io/group-cleanup"},
}, },
Spec: netbirdiov1.NBGroupSpec{ Spec: nbv1.NBGroupSpec{
Name: controllerReconciler.ClusterName, Name: controllerReconciler.ClusterName,
}, },
} }
@@ -1102,7 +1102,7 @@ var _ = Describe("NBRoutingPeer Controller", func() {
NamespacedName: typeNamespacedName, NamespacedName: typeNamespacedName,
}) })
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
group := &netbirdiov1.NBGroup{} group := &nbv1.NBGroup{}
Expect(k8sClient.Get(ctx, typeNamespacedName, group)).To(Succeed()) Expect(k8sClient.Get(ctx, typeNamespacedName, group)).To(Succeed())
Expect(group.Finalizers).NotTo(ContainElement("netbird.io/routing-peer-cleanup")) 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() { It("should delete any hanging NBResources", func() {
nbResource := &netbirdiov1.NBResource{ nbResource := &nbv1.NBResource{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: typeNamespacedName.Name, Name: typeNamespacedName.Name,
Namespace: typeNamespacedName.Namespace, Namespace: typeNamespacedName.Namespace,
}, },
Spec: netbirdiov1.NBResourceSpec{ Spec: nbv1.NBResourceSpec{
Name: "test", Name: "test",
NetworkID: *nbroutingpeer.Status.NetworkID, NetworkID: *nbroutingpeer.Status.NetworkID,
Address: "test", Address: "test",
@@ -1155,7 +1155,7 @@ var _ = Describe("NBRoutingPeer Controller", func() {
NamespacedName: typeNamespacedName, NamespacedName: typeNamespacedName,
}) })
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
nbResource = &netbirdiov1.NBResource{} nbResource = &nbv1.NBResource{}
err = k8sClient.Get(ctx, typeNamespacedName, nbResource) err = k8sClient.Get(ctx, typeNamespacedName, nbResource)
Expect(errors.IsNotFound(err)).To(BeTrue()) Expect(errors.IsNotFound(err)).To(BeTrue())
}) })
+21 -21
View File
@@ -23,14 +23,14 @@ import (
"github.com/google/uuid" "github.com/google/uuid"
corev1 "k8s.io/api/core/v1" corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/errors" "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" "k8s.io/apimachinery/pkg/types"
ctrl "sigs.k8s.io/controller-runtime" ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/handler" "sigs.k8s.io/controller-runtime/pkg/handler"
"sigs.k8s.io/controller-runtime/pkg/reconcile" "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 // 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 := ctrl.Log.WithName("NBSetupKey").WithValues("namespace", req.Namespace, "name", req.Name)
logger.Info("Reconciling NBSetupKey") logger.Info("Reconciling NBSetupKey")
nbSetupKey := netbirdiov1.NBSetupKey{} nbSetupKey := nbv1.NBSetupKey{}
err := r.Get(ctx, req.NamespacedName, &nbSetupKey) err := r.Get(ctx, req.NamespacedName, &nbSetupKey)
if err != nil { if err != nil {
logger.Error(fmt.Errorf("internalError"), "error getting NBSetupKey", "err", err) 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 == "" { if nbSetupKey.Spec.SecretKeyRef.Name == "" || nbSetupKey.Spec.SecretKeyRef.Key == "" {
logger.Error(fmt.Errorf("invalid NBSetupKey"), "secretKeyRef must contain both secret name and secret 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{ return ctrl.Result{}, r.setStatus(ctx, &nbSetupKey, nbv1.NBSetupKeyStatus{
Conditions: []netbirdiov1.NBCondition{ Conditions: []nbv1.NBCondition{
{ {
Type: netbirdiov1.NBSetupKeyReady, Type: nbv1.NBSetupKeyReady,
Status: corev1.ConditionFalse, Status: corev1.ConditionFalse,
LastProbeTime: v1.Now(), LastProbeTime: metav1.Now(),
Reason: "InvalidConfig", Reason: "InvalidConfig",
Message: "secretKeyRef must contain both secret name and secret key.", 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 return ctrl.Result{}, err
} }
logger.Error(fmt.Errorf("invalid NBSetupKey"), "secret referenced not found", "err", 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{{ return ctrl.Result{}, r.setStatus(ctx, &nbSetupKey, nbv1.NBSetupKeyStatus{Conditions: []nbv1.NBCondition{{
Type: netbirdiov1.NBSetupKeyReady, Type: nbv1.NBSetupKeyReady,
Status: corev1.ConditionFalse, Status: corev1.ConditionFalse,
LastProbeTime: v1.Now(), LastProbeTime: metav1.Now(),
Reason: "SecretNotExists", Reason: "SecretNotExists",
Message: "Referenced secret does not exist", 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] uuidBytes, ok := secret.Data[nbSetupKey.Spec.SecretKeyRef.Key]
if !ok { if !ok {
logger.Error(fmt.Errorf("invalid NBSetupKey"), "secret key referenced not found") logger.Error(fmt.Errorf("invalid NBSetupKey"), "secret key referenced not found")
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, Status: corev1.ConditionFalse,
LastProbeTime: v1.Now(), LastProbeTime: metav1.Now(),
Reason: "SecretKeyNotExists", Reason: "SecretKeyNotExists",
Message: "Referenced secret key does not exist", 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)) _, err = uuid.Parse(string(uuidBytes))
if err != nil { if err != nil {
logger.Error(fmt.Errorf("invalid NBSetupKey"), "setupKey is not a valid UUID", "err", err) 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{{ return ctrl.Result{}, r.setStatus(ctx, &nbSetupKey, nbv1.NBSetupKeyStatus{Conditions: []nbv1.NBCondition{{
Type: netbirdiov1.NBSetupKeyReady, Type: nbv1.NBSetupKeyReady,
Status: corev1.ConditionFalse, Status: corev1.ConditionFalse,
LastProbeTime: v1.Now(), LastProbeTime: metav1.Now(),
Reason: "InvalidSetupKey", Reason: "InvalidSetupKey",
Message: "Referenced secret is not a valid SetupKey", Message: "Referenced secret is not a valid SetupKey",
}}}) }}})
} }
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.ConditionTrue, 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 nbsetupkey.Status = status
err := r.Status().Update(ctx, nbsetupkey) err := r.Status().Update(ctx, nbsetupkey)
return err return err
@@ -135,7 +135,7 @@ func (r *NBSetupKeyReconciler) SetupWithManager(mgr ctrl.Manager) error {
r.ReferencedSecrets = make(map[string]types.NamespacedName) r.ReferencedSecrets = make(map[string]types.NamespacedName)
return ctrl.NewControllerManagedBy(mgr). return ctrl.NewControllerManagedBy(mgr).
For(&netbirdiov1.NBSetupKey{}). For(&nbv1.NBSetupKey{}).
Named("nbsetupkey"). Named("nbsetupkey").
Watches( Watches(
&corev1.Secret{}, &corev1.Secret{},
@@ -21,13 +21,12 @@ import (
. "github.com/onsi/ginkgo/v2" . "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega" . "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" "k8s.io/apimachinery/pkg/types"
"sigs.k8s.io/controller-runtime/pkg/reconcile" "sigs.k8s.io/controller-runtime/pkg/reconcile"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" nbv1 "github.com/netbirdio/kubernetes-operator/api/v1"
netbirdiov1 "github.com/netbirdio/kubernetes-operator/api/v1"
) )
var _ = Describe("NBSetupKey Controller", func() { var _ = Describe("NBSetupKey Controller", func() {
@@ -40,20 +39,20 @@ var _ = Describe("NBSetupKey Controller", func() {
Name: resourceName, Name: resourceName,
Namespace: "default", Namespace: "default",
} }
nbsetupkey := &netbirdiov1.NBSetupKey{} nbsetupkey := &nbv1.NBSetupKey{}
secret := &v1.Secret{} secret := &corev1.Secret{}
BeforeEach(func() { BeforeEach(func() {
By("creating the custom resource for the Kind NBSetupKey") By("creating the custom resource for the Kind NBSetupKey")
err := k8sClient.Get(ctx, typeNamespacedName, nbsetupkey) err := k8sClient.Get(ctx, typeNamespacedName, nbsetupkey)
resource := &netbirdiov1.NBSetupKey{ resource := &nbv1.NBSetupKey{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: resourceName, Name: resourceName,
Namespace: "default", Namespace: "default",
}, },
Spec: netbirdiov1.NBSetupKeySpec{ Spec: nbv1.NBSetupKeySpec{
SecretKeyRef: v1.SecretKeySelector{ SecretKeyRef: corev1.SecretKeySelector{
LocalObjectReference: v1.LocalObjectReference{ LocalObjectReference: corev1.LocalObjectReference{
Name: resourceName, Name: resourceName,
}, },
Key: "setupkey", Key: "setupkey",
@@ -67,7 +66,7 @@ var _ = Describe("NBSetupKey Controller", func() {
}) })
AfterEach(func() { AfterEach(func() {
resource := &netbirdiov1.NBSetupKey{} resource := &nbv1.NBSetupKey{}
err := k8sClient.Get(ctx, typeNamespacedName, resource) err := k8sClient.Get(ctx, typeNamespacedName, resource)
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
@@ -92,7 +91,7 @@ var _ = Describe("NBSetupKey Controller", func() {
Expect(nbsetupkey.Status.Conditions).NotTo(BeNil()) Expect(nbsetupkey.Status.Conditions).NotTo(BeNil())
Expect(nbsetupkey.Status.Conditions).To(HaveLen(1)) 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(nbsetupkey.Status.Conditions[0].Reason).To(Equal("SecretNotExists"))
Expect(controllerReconciler.ReferencedSecrets).To(HaveKey("default/test-resource")) Expect(controllerReconciler.ReferencedSecrets).To(HaveKey("default/test-resource"))
}) })
@@ -100,7 +99,7 @@ var _ = Describe("NBSetupKey Controller", func() {
When("Secret present", Ordered, func() { When("Secret present", Ordered, func() {
createSecret := func(secretkey, setupkey string) { createSecret := func(secretkey, setupkey string) {
resource := &v1.Secret{ resource := &corev1.Secret{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Namespace: "default", Namespace: "default",
Name: resourceName, 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) err := k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: resourceName}, secret)
if err == nil { if err == nil {
Expect(k8sClient.Delete(ctx, secret)).To(Succeed()) 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).NotTo(BeNil())
Expect(nbsetupkey.Status.Conditions).To(HaveLen(1)) 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(nbsetupkey.Status.Conditions[0].Reason).To(Equal("InvalidSetupKey"))
Expect(controllerReconciler.ReferencedSecrets).To(HaveKey("default/test-resource")) 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).NotTo(BeNil())
Expect(nbsetupkey.Status.Conditions).To(HaveLen(1)) 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(nbsetupkey.Status.Conditions[0].Reason).To(Equal("SecretKeyNotExists"))
Expect(controllerReconciler.ReferencedSecrets).To(HaveKey("default/test-resource")) 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).NotTo(BeNil())
Expect(nbsetupkey.Status.Conditions).To(HaveLen(1)) 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")) Expect(controllerReconciler.ReferencedSecrets).To(HaveKey("default/test-resource"))
}) })
}) })
@@ -8,8 +8,6 @@ import (
"github.com/fluxcd/pkg/runtime/conditions" "github.com/fluxcd/pkg/runtime/conditions"
"github.com/fluxcd/pkg/runtime/patch" "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" corev1 "k8s.io/api/core/v1"
kerrors "k8s.io/apimachinery/pkg/api/errors" kerrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -23,6 +21,9 @@ import (
"sigs.k8s.io/controller-runtime/pkg/predicate" "sigs.k8s.io/controller-runtime/pkg/predicate"
"sigs.k8s.io/controller-runtime/pkg/reconcile" "sigs.k8s.io/controller-runtime/pkg/reconcile"
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" nbv1alpha1 "github.com/netbirdio/kubernetes-operator/api/v1alpha1"
"github.com/netbirdio/kubernetes-operator/internal/k8sutil" "github.com/netbirdio/kubernetes-operator/internal/k8sutil"
"github.com/netbirdio/kubernetes-operator/internal/netbirdutil" "github.com/netbirdio/kubernetes-operator/internal/netbirdutil"
@@ -12,9 +12,10 @@ import (
"sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/reconcile" "sigs.k8s.io/controller-runtime/pkg/reconcile"
"github.com/netbirdio/netbird/shared/management/http/api"
nbv1alpha1 "github.com/netbirdio/kubernetes-operator/api/v1alpha1" nbv1alpha1 "github.com/netbirdio/kubernetes-operator/api/v1alpha1"
"github.com/netbirdio/kubernetes-operator/internal/netbirdmock" "github.com/netbirdio/kubernetes-operator/internal/netbirdmock"
"github.com/netbirdio/netbird/shared/management/http/api"
) )
var _ = Describe("NetworkResource Controller", func() { var _ = Describe("NetworkResource Controller", func() {
@@ -10,10 +10,6 @@ import (
"github.com/fluxcd/pkg/runtime/conditions" "github.com/fluxcd/pkg/runtime/conditions"
"github.com/fluxcd/pkg/runtime/patch" "github.com/fluxcd/pkg/runtime/patch"
"github.com/netbirdio/kubernetes-operator/internal/k8sutil"
"github.com/netbirdio/kubernetes-operator/internal/netbirdutil"
netbird "github.com/netbirdio/netbird/shared/management/client/rest"
"github.com/netbirdio/netbird/shared/management/http/api"
appsv1 "k8s.io/api/apps/v1" appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1" corev1 "k8s.io/api/core/v1"
policyv1 "k8s.io/api/policy/v1" policyv1 "k8s.io/api/policy/v1"
@@ -31,7 +27,12 @@ import (
"sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" "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" nbv1alpha1 "github.com/netbirdio/kubernetes-operator/api/v1alpha1"
"github.com/netbirdio/kubernetes-operator/internal/k8sutil"
"github.com/netbirdio/kubernetes-operator/internal/netbirdutil"
nbv1alpha1ac "github.com/netbirdio/kubernetes-operator/pkg/applyconfigurations/api/v1alpha1" nbv1alpha1ac "github.com/netbirdio/kubernetes-operator/pkg/applyconfigurations/api/v1alpha1"
) )
@@ -13,9 +13,10 @@ import (
"sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/reconcile" "sigs.k8s.io/controller-runtime/pkg/reconcile"
"github.com/netbirdio/netbird/shared/management/http/api"
nbv1alpha1 "github.com/netbirdio/kubernetes-operator/api/v1alpha1" nbv1alpha1 "github.com/netbirdio/kubernetes-operator/api/v1alpha1"
"github.com/netbirdio/kubernetes-operator/internal/netbirdmock" "github.com/netbirdio/kubernetes-operator/internal/netbirdmock"
"github.com/netbirdio/netbird/shared/management/http/api"
) )
var _ = Describe("NetworkRouter Controller", func() { var _ = Describe("NetworkRouter Controller", func() {
+10 -10
View File
@@ -11,12 +11,12 @@ import (
"github.com/go-logr/logr" "github.com/go-logr/logr"
corev1 "k8s.io/api/core/v1" corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/errors" "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" "k8s.io/apimachinery/pkg/types"
ctrl "sigs.k8s.io/controller-runtime" ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client"
netbirdiov1 "github.com/netbirdio/kubernetes-operator/api/v1" nbv1 "github.com/netbirdio/kubernetes-operator/api/v1"
"github.com/netbirdio/kubernetes-operator/internal/util" "github.com/netbirdio/kubernetes-operator/internal/util"
) )
@@ -82,7 +82,7 @@ func (r *ServiceReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
// hideService deletes NBResource for Service // hideService deletes NBResource for Service
func (r *ServiceReconciler) hideService(ctx context.Context, req ctrl.Request, svc corev1.Service, logger logr.Logger) (ctrl.Result, error) { func (r *ServiceReconciler) hideService(ctx context.Context, req ctrl.Request, svc corev1.Service, logger logr.Logger) (ctrl.Result, error) {
var nbResource netbirdiov1.NBResource var nbResource nbv1.NBResource
err := r.Client.Get(ctx, req.NamespacedName, &nbResource) err := r.Client.Get(ctx, req.NamespacedName, &nbResource)
if err != nil && !errors.IsNotFound(err) { if err != nil && !errors.IsNotFound(err) {
logger.Error(errKubernetesAPI, "error getting NBResource", "err", err) logger.Error(errKubernetesAPI, "error getting NBResource", "err", err)
@@ -125,7 +125,7 @@ func (r *ServiceReconciler) exposeService(ctx context.Context, req ctrl.Request,
} }
} }
var routingPeer netbirdiov1.NBRoutingPeer var routingPeer nbv1.NBRoutingPeer
// Check if NBRoutingPeer exists // Check if NBRoutingPeer exists
err := r.Client.Get(ctx, types.NamespacedName{Namespace: routerNamespace, Name: "router"}, &routingPeer) err := r.Client.Get(ctx, types.NamespacedName{Namespace: routerNamespace, Name: "router"}, &routingPeer)
if err != nil && !errors.IsNotFound(err) { if err != nil && !errors.IsNotFound(err) {
@@ -135,14 +135,14 @@ func (r *ServiceReconciler) exposeService(ctx context.Context, req ctrl.Request,
// Create NBRoutingPeer with default values if not exists // Create NBRoutingPeer with default values if not exists
if errors.IsNotFound(err) { if errors.IsNotFound(err) {
routingPeer = netbirdiov1.NBRoutingPeer{ routingPeer = nbv1.NBRoutingPeer{
ObjectMeta: v1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "router", Name: "router",
Namespace: routerNamespace, Namespace: routerNamespace,
Finalizers: []string{"netbird.io/cleanup"}, Finalizers: []string{"netbird.io/cleanup"},
Labels: r.DefaultLabels, Labels: r.DefaultLabels,
}, },
Spec: netbirdiov1.NBRoutingPeerSpec{}, Spec: nbv1.NBRoutingPeerSpec{},
} }
err = r.Client.Create(ctx, &routingPeer) err = r.Client.Create(ctx, &routingPeer)
@@ -161,7 +161,7 @@ func (r *ServiceReconciler) exposeService(ctx context.Context, req ctrl.Request,
return ctrl.Result{RequeueAfter: 5 * time.Second}, nil return ctrl.Result{RequeueAfter: 5 * time.Second}, nil
} }
var nbResource netbirdiov1.NBResource var nbResource nbv1.NBResource
err = r.Client.Get(ctx, req.NamespacedName, &nbResource) err = r.Client.Get(ctx, req.NamespacedName, &nbResource)
if err != nil && !errors.IsNotFound(err) { if err != nil && !errors.IsNotFound(err) {
logger.Error(errKubernetesAPI, "error getting NBResource", "err", err) logger.Error(errKubernetesAPI, "error getting NBResource", "err", err)
@@ -192,7 +192,7 @@ func (r *ServiceReconciler) exposeService(ctx context.Context, req ctrl.Request,
} }
// reconcileNBResource ensures NBResource settings are in-line with Service definition and annotations // reconcileNBResource ensures NBResource settings are in-line with Service definition and annotations
func (r *ServiceReconciler) reconcileNBResource(nbResource *netbirdiov1.NBResource, req ctrl.Request, svc corev1.Service, routingPeer netbirdiov1.NBRoutingPeer, logger logr.Logger) error { func (r *ServiceReconciler) reconcileNBResource(nbResource *nbv1.NBResource, req ctrl.Request, svc corev1.Service, routingPeer nbv1.NBRoutingPeer, logger logr.Logger) error {
groups := []string{fmt.Sprintf("%s-%s-%s", r.ClusterName, req.Namespace, req.Name)} groups := []string{fmt.Sprintf("%s-%s-%s", r.ClusterName, req.Namespace, req.Name)}
if v, ok := svc.Annotations[serviceGroupsAnnotation]; ok { if v, ok := svc.Annotations[serviceGroupsAnnotation]; ok {
//nolint:prealloc //nolint:prealloc
@@ -230,7 +230,7 @@ func (r *ServiceReconciler) reconcileNBResource(nbResource *netbirdiov1.NBResour
return nil return nil
} }
func (r *ServiceReconciler) applyPolicy(nbResource *netbirdiov1.NBResource, svc corev1.Service, logger logr.Logger) error { func (r *ServiceReconciler) applyPolicy(nbResource *nbv1.NBResource, svc corev1.Service, logger logr.Logger) error {
nbResource.Spec.PolicyName = svc.Annotations[servicePolicyAnnotation] nbResource.Spec.PolicyName = svc.Annotations[servicePolicyAnnotation]
var filterProtocols []string var filterProtocols []string
if v, ok := svc.Annotations[serviceProtocolAnnotation]; ok { if v, ok := svc.Annotations[serviceProtocolAnnotation]; ok {
+40 -39
View File
@@ -1,16 +1,17 @@
package controller package controller
import ( import (
netbirdiov1 "github.com/netbirdio/kubernetes-operator/api/v1"
"github.com/netbirdio/kubernetes-operator/internal/util"
. "github.com/onsi/ginkgo/v2" . "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega" . "github.com/onsi/gomega"
corev1 "k8s.io/api/core/v1" corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/errors" "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" "k8s.io/apimachinery/pkg/types"
"k8s.io/apimachinery/pkg/util/intstr" "k8s.io/apimachinery/pkg/util/intstr"
"sigs.k8s.io/controller-runtime/pkg/reconcile" "sigs.k8s.io/controller-runtime/pkg/reconcile"
nbv1 "github.com/netbirdio/kubernetes-operator/api/v1"
"github.com/netbirdio/kubernetes-operator/internal/util"
) )
var _ = Describe("Service Controller", func() { var _ = Describe("Service Controller", func() {
@@ -26,7 +27,7 @@ var _ = Describe("Service Controller", func() {
BeforeEach(func() { BeforeEach(func() {
service = &corev1.Service{ service = &corev1.Service{
ObjectMeta: v1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "test-resource", Name: "test-resource",
Namespace: "default", Namespace: "default",
}, },
@@ -85,7 +86,7 @@ var _ = Describe("Service Controller", func() {
} }
} }
nbrp := &netbirdiov1.NBRoutingPeer{} nbrp := &nbv1.NBRoutingPeer{}
err = k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "router"}, nbrp) err = k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "router"}, nbrp)
if !errors.IsNotFound(err) { if !errors.IsNotFound(err) {
if len(nbrp.Finalizers) > 0 { if len(nbrp.Finalizers) > 0 {
@@ -99,7 +100,7 @@ var _ = Describe("Service Controller", func() {
} }
} }
nbResource := &netbirdiov1.NBResource{} nbResource := &nbv1.NBResource{}
err = k8sClient.Get(ctx, typeNamespacedName, nbResource) err = k8sClient.Get(ctx, typeNamespacedName, nbResource)
if !errors.IsNotFound(err) { if !errors.IsNotFound(err) {
if len(nbResource.Finalizers) > 0 { if len(nbResource.Finalizers) > 0 {
@@ -123,7 +124,7 @@ var _ = Describe("Service Controller", func() {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
Expect(k8sClient.Get(ctx, typeNamespacedName, service)).To(Succeed()) Expect(k8sClient.Get(ctx, typeNamespacedName, service)).To(Succeed())
Expect(service.Finalizers).To(BeEmpty()) Expect(service.Finalizers).To(BeEmpty())
nbResource := &netbirdiov1.NBResource{} nbResource := &nbv1.NBResource{}
Expect(k8sClient.Get(ctx, typeNamespacedName, nbResource)).NotTo(Succeed()) Expect(k8sClient.Get(ctx, typeNamespacedName, nbResource)).NotTo(Succeed())
}) })
}) })
@@ -142,7 +143,7 @@ var _ = Describe("Service Controller", func() {
}) })
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
Expect(res.RequeueAfter).NotTo(BeZero()) Expect(res.RequeueAfter).NotTo(BeZero())
nbrp := &netbirdiov1.NBRoutingPeer{} nbrp := &nbv1.NBRoutingPeer{}
Expect(k8sClient.Get(ctx, types.NamespacedName{Namespace: typeNamespacedName.Namespace, Name: "router"}, nbrp)).To(Succeed()) Expect(k8sClient.Get(ctx, types.NamespacedName{Namespace: typeNamespacedName.Namespace, Name: "router"}, nbrp)).To(Succeed())
Expect(nbrp.Labels).To(HaveKeyWithValue("dog", "bark")) Expect(nbrp.Labels).To(HaveKeyWithValue("dog", "bark"))
res, err = controllerReconciler.Reconcile(ctx, reconcile.Request{ res, err = controllerReconciler.Reconcile(ctx, reconcile.Request{
@@ -161,12 +162,12 @@ var _ = Describe("Service Controller", func() {
}) })
When("NBRoutingPeer exists", func() { When("NBRoutingPeer exists", func() {
BeforeEach(func() { BeforeEach(func() {
nbrp := &netbirdiov1.NBRoutingPeer{ nbrp := &nbv1.NBRoutingPeer{
ObjectMeta: v1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Namespace: typeNamespacedName.Namespace, Namespace: typeNamespacedName.Namespace,
Name: "router", Name: "router",
}, },
Spec: netbirdiov1.NBRoutingPeerSpec{}, Spec: nbv1.NBRoutingPeerSpec{},
} }
Expect(k8sClient.Create(ctx, nbrp)).To(Succeed()) Expect(k8sClient.Create(ctx, nbrp)).To(Succeed())
@@ -195,7 +196,7 @@ var _ = Describe("Service Controller", func() {
NamespacedName: typeNamespacedName, NamespacedName: typeNamespacedName,
}) })
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
nbResource := &netbirdiov1.NBResource{} nbResource := &nbv1.NBResource{}
Expect(k8sClient.Get(ctx, typeNamespacedName, nbResource)).To(Succeed()) Expect(k8sClient.Get(ctx, typeNamespacedName, nbResource)).To(Succeed())
Expect(nbResource.Spec.Address).To(Equal(typeNamespacedName.Name + "." + typeNamespacedName.Namespace + "." + controllerReconciler.ClusterDNS)) Expect(nbResource.Spec.Address).To(Equal(typeNamespacedName.Name + "." + typeNamespacedName.Namespace + "." + controllerReconciler.ClusterDNS))
Expect(nbResource.Spec.Groups).To(ConsistOf([]string{controllerReconciler.ClusterName + "-" + typeNamespacedName.Namespace + "-" + typeNamespacedName.Name})) Expect(nbResource.Spec.Groups).To(ConsistOf([]string{controllerReconciler.ClusterName + "-" + typeNamespacedName.Namespace + "-" + typeNamespacedName.Name}))
@@ -218,7 +219,7 @@ var _ = Describe("Service Controller", func() {
NamespacedName: typeNamespacedName, NamespacedName: typeNamespacedName,
}) })
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
nbResource := &netbirdiov1.NBResource{} nbResource := &nbv1.NBResource{}
Expect(k8sClient.Get(ctx, typeNamespacedName, nbResource)).To(Succeed()) Expect(k8sClient.Get(ctx, typeNamespacedName, nbResource)).To(Succeed())
Expect(nbResource.Spec.PolicyName).To(Equal(policyName)) Expect(nbResource.Spec.PolicyName).To(Equal(policyName))
Expect(nbResource.Spec.TCPPorts).To(ConsistOf([]int32{443, 80})) Expect(nbResource.Spec.TCPPorts).To(ConsistOf([]int32{443, 80}))
@@ -234,7 +235,7 @@ var _ = Describe("Service Controller", func() {
NamespacedName: typeNamespacedName, NamespacedName: typeNamespacedName,
}) })
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
nbResource := &netbirdiov1.NBResource{} nbResource := &nbv1.NBResource{}
Expect(k8sClient.Get(ctx, typeNamespacedName, nbResource)).To(Succeed()) Expect(k8sClient.Get(ctx, typeNamespacedName, nbResource)).To(Succeed())
Expect(nbResource.Spec.PolicyName).To(Equal(policyName)) Expect(nbResource.Spec.PolicyName).To(Equal(policyName))
Expect(nbResource.Spec.TCPPorts).To(ConsistOf([]int32{80})) Expect(nbResource.Spec.TCPPorts).To(ConsistOf([]int32{80}))
@@ -250,7 +251,7 @@ var _ = Describe("Service Controller", func() {
NamespacedName: typeNamespacedName, NamespacedName: typeNamespacedName,
}) })
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
nbResource := &netbirdiov1.NBResource{} nbResource := &nbv1.NBResource{}
Expect(k8sClient.Get(ctx, typeNamespacedName, nbResource)).To(Succeed()) Expect(k8sClient.Get(ctx, typeNamespacedName, nbResource)).To(Succeed())
Expect(nbResource.Spec.PolicyName).To(Equal(policyName)) Expect(nbResource.Spec.PolicyName).To(Equal(policyName))
Expect(nbResource.Spec.TCPPorts).To(ConsistOf([]int32{80, 443})) Expect(nbResource.Spec.TCPPorts).To(ConsistOf([]int32{80, 443}))
@@ -266,7 +267,7 @@ var _ = Describe("Service Controller", func() {
NamespacedName: typeNamespacedName, NamespacedName: typeNamespacedName,
}) })
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
nbResource := &netbirdiov1.NBResource{} nbResource := &nbv1.NBResource{}
Expect(k8sClient.Get(ctx, typeNamespacedName, nbResource)).To(Succeed()) Expect(k8sClient.Get(ctx, typeNamespacedName, nbResource)).To(Succeed())
Expect(nbResource.Spec.Name).To(Equal("meow")) Expect(nbResource.Spec.Name).To(Equal("meow"))
}) })
@@ -279,7 +280,7 @@ var _ = Describe("Service Controller", func() {
NamespacedName: typeNamespacedName, NamespacedName: typeNamespacedName,
}) })
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
nbResource := &netbirdiov1.NBResource{} nbResource := &nbv1.NBResource{}
Expect(k8sClient.Get(ctx, typeNamespacedName, nbResource)).To(Succeed()) Expect(k8sClient.Get(ctx, typeNamespacedName, nbResource)).To(Succeed())
Expect(nbResource.Spec.Groups).To(ConsistOf([]string{"meow", "wow", policyName})) Expect(nbResource.Spec.Groups).To(ConsistOf([]string{"meow", "wow", policyName}))
}) })
@@ -289,12 +290,12 @@ var _ = Describe("Service Controller", func() {
}) })
When("Service is already exposed", func() { When("Service is already exposed", func() {
BeforeEach(func() { BeforeEach(func() {
nbResource := &netbirdiov1.NBResource{ nbResource := &nbv1.NBResource{
ObjectMeta: v1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: typeNamespacedName.Name, Name: typeNamespacedName.Name,
Namespace: typeNamespacedName.Namespace, Namespace: typeNamespacedName.Namespace,
}, },
Spec: netbirdiov1.NBResourceSpec{ Spec: nbv1.NBResourceSpec{
Name: typeNamespacedName.Namespace + "-" + typeNamespacedName.Name, Name: typeNamespacedName.Namespace + "-" + typeNamespacedName.Name,
Address: typeNamespacedName.Name + "." + typeNamespacedName.Namespace + "." + controllerReconciler.ClusterDNS, Address: typeNamespacedName.Name + "." + typeNamespacedName.Namespace + "." + controllerReconciler.ClusterDNS,
Groups: []string{controllerReconciler.ClusterName + "-" + typeNamespacedName.Namespace + "-" + typeNamespacedName.Name}, Groups: []string{controllerReconciler.ClusterName + "-" + typeNamespacedName.Namespace + "-" + typeNamespacedName.Name},
@@ -309,12 +310,12 @@ var _ = Describe("Service Controller", func() {
service.Annotations[ServiceExposeAnnotation] = "true" service.Annotations[ServiceExposeAnnotation] = "true"
Expect(k8sClient.Update(ctx, service)).To(Succeed()) Expect(k8sClient.Update(ctx, service)).To(Succeed())
nbrp := &netbirdiov1.NBRoutingPeer{ nbrp := &nbv1.NBRoutingPeer{
ObjectMeta: v1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Namespace: typeNamespacedName.Namespace, Namespace: typeNamespacedName.Namespace,
Name: "router", Name: "router",
}, },
Spec: netbirdiov1.NBRoutingPeerSpec{}, Spec: nbv1.NBRoutingPeerSpec{},
} }
Expect(k8sClient.Create(ctx, nbrp)).To(Succeed()) Expect(k8sClient.Create(ctx, nbrp)).To(Succeed())
@@ -332,7 +333,7 @@ var _ = Describe("Service Controller", func() {
NamespacedName: typeNamespacedName, NamespacedName: typeNamespacedName,
}) })
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
nbResource := &netbirdiov1.NBResource{} nbResource := &nbv1.NBResource{}
err = k8sClient.Get(ctx, typeNamespacedName, nbResource) err = k8sClient.Get(ctx, typeNamespacedName, nbResource)
if !errors.IsNotFound(err) { if !errors.IsNotFound(err) {
Expect(nbResource.DeletionTimestamp).NotTo(BeNil()) Expect(nbResource.DeletionTimestamp).NotTo(BeNil())
@@ -349,7 +350,7 @@ var _ = Describe("Service Controller", func() {
}) })
When("Nothing changes", func() { When("Nothing changes", func() {
It("should do nothing", func() { It("should do nothing", func() {
nbResource := &netbirdiov1.NBResource{} nbResource := &nbv1.NBResource{}
Expect(k8sClient.Get(ctx, typeNamespacedName, nbResource)).To(Succeed()) Expect(k8sClient.Get(ctx, typeNamespacedName, nbResource)).To(Succeed())
resourceVersion := nbResource.ResourceVersion resourceVersion := nbResource.ResourceVersion
@@ -358,7 +359,7 @@ var _ = Describe("Service Controller", func() {
}) })
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
nbResource = &netbirdiov1.NBResource{} nbResource = &nbv1.NBResource{}
Expect(k8sClient.Get(ctx, typeNamespacedName, nbResource)).To(Succeed()) Expect(k8sClient.Get(ctx, typeNamespacedName, nbResource)).To(Succeed())
Expect(resourceVersion).To(BeEquivalentTo(nbResource.ResourceVersion)) Expect(resourceVersion).To(BeEquivalentTo(nbResource.ResourceVersion))
}) })
@@ -372,14 +373,14 @@ var _ = Describe("Service Controller", func() {
}) })
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
nbResource := &netbirdiov1.NBResource{} nbResource := &nbv1.NBResource{}
Expect(k8sClient.Get(ctx, typeNamespacedName, nbResource)).To(Succeed()) Expect(k8sClient.Get(ctx, typeNamespacedName, nbResource)).To(Succeed())
Expect(nbResource.Spec.PolicyName).To(Equal(policyName)) Expect(nbResource.Spec.PolicyName).To(Equal(policyName))
}) })
}) })
When("policy is removed", func() { When("policy is removed", func() {
It("should remove policy in NBResource spec", func() { It("should remove policy in NBResource spec", func() {
nbResource := &netbirdiov1.NBResource{} nbResource := &nbv1.NBResource{}
Expect(k8sClient.Get(ctx, typeNamespacedName, nbResource)).To(Succeed()) Expect(k8sClient.Get(ctx, typeNamespacedName, nbResource)).To(Succeed())
nbResource.Spec.PolicyName = policyName nbResource.Spec.PolicyName = policyName
Expect(k8sClient.Update(ctx, nbResource)).To(Succeed()) Expect(k8sClient.Update(ctx, nbResource)).To(Succeed())
@@ -389,14 +390,14 @@ var _ = Describe("Service Controller", func() {
}) })
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
nbResource = &netbirdiov1.NBResource{} nbResource = &nbv1.NBResource{}
Expect(k8sClient.Get(ctx, typeNamespacedName, nbResource)).To(Succeed()) Expect(k8sClient.Get(ctx, typeNamespacedName, nbResource)).To(Succeed())
Expect(nbResource.Spec.PolicyName).To(Equal("")) Expect(nbResource.Spec.PolicyName).To(Equal(""))
}) })
}) })
When("policy ports changes", func() { When("policy ports changes", func() {
It("should update ports in NBResource spec", func() { It("should update ports in NBResource spec", func() {
nbResource := &netbirdiov1.NBResource{} nbResource := &nbv1.NBResource{}
Expect(k8sClient.Get(ctx, typeNamespacedName, nbResource)).To(Succeed()) Expect(k8sClient.Get(ctx, typeNamespacedName, nbResource)).To(Succeed())
nbResource.Spec.PolicyName = policyName nbResource.Spec.PolicyName = policyName
nbResource.Spec.TCPPorts = []int32{443, 80} nbResource.Spec.TCPPorts = []int32{443, 80}
@@ -412,7 +413,7 @@ var _ = Describe("Service Controller", func() {
}) })
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
nbResource = &netbirdiov1.NBResource{} nbResource = &nbv1.NBResource{}
Expect(k8sClient.Get(ctx, typeNamespacedName, nbResource)).To(Succeed()) Expect(k8sClient.Get(ctx, typeNamespacedName, nbResource)).To(Succeed())
Expect(nbResource.Spec.TCPPorts).To(ConsistOf([]int32{80})) Expect(nbResource.Spec.TCPPorts).To(ConsistOf([]int32{80}))
Expect(nbResource.Spec.UDPPorts).To(ConsistOf([]int32{80})) Expect(nbResource.Spec.UDPPorts).To(ConsistOf([]int32{80}))
@@ -420,7 +421,7 @@ var _ = Describe("Service Controller", func() {
}) })
When("policy protocol changes", func() { When("policy protocol changes", func() {
It("should update protocol in NBResource spec", func() { It("should update protocol in NBResource spec", func() {
nbResource := &netbirdiov1.NBResource{} nbResource := &nbv1.NBResource{}
Expect(k8sClient.Get(ctx, typeNamespacedName, nbResource)).To(Succeed()) Expect(k8sClient.Get(ctx, typeNamespacedName, nbResource)).To(Succeed())
nbResource.Spec.PolicyName = policyName nbResource.Spec.PolicyName = policyName
nbResource.Spec.TCPPorts = []int32{443, 80} nbResource.Spec.TCPPorts = []int32{443, 80}
@@ -436,7 +437,7 @@ var _ = Describe("Service Controller", func() {
}) })
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
nbResource = &netbirdiov1.NBResource{} nbResource = &nbv1.NBResource{}
Expect(k8sClient.Get(ctx, typeNamespacedName, nbResource)).To(Succeed()) Expect(k8sClient.Get(ctx, typeNamespacedName, nbResource)).To(Succeed())
Expect(nbResource.Spec.TCPPorts).To(ConsistOf([]int32{80, 443})) Expect(nbResource.Spec.TCPPorts).To(ConsistOf([]int32{80, 443}))
Expect(nbResource.Spec.UDPPorts).To(BeEmpty()) Expect(nbResource.Spec.UDPPorts).To(BeEmpty())
@@ -444,7 +445,7 @@ var _ = Describe("Service Controller", func() {
}) })
When("policy friendly name changes", func() { When("policy friendly name changes", func() {
It("should update policy friendly name in NBResource spec", func() { It("should update policy friendly name in NBResource spec", func() {
nbResource := &netbirdiov1.NBResource{} nbResource := &nbv1.NBResource{}
Expect(k8sClient.Get(ctx, typeNamespacedName, nbResource)).To(Succeed()) Expect(k8sClient.Get(ctx, typeNamespacedName, nbResource)).To(Succeed())
nbResource.Spec.PolicyName = policyName nbResource.Spec.PolicyName = policyName
Expect(k8sClient.Update(ctx, nbResource)).To(Succeed()) Expect(k8sClient.Update(ctx, nbResource)).To(Succeed())
@@ -458,14 +459,14 @@ var _ = Describe("Service Controller", func() {
}) })
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
nbResource = &netbirdiov1.NBResource{} nbResource = &nbv1.NBResource{}
Expect(k8sClient.Get(ctx, typeNamespacedName, nbResource)).To(Succeed()) Expect(k8sClient.Get(ctx, typeNamespacedName, nbResource)).To(Succeed())
Expect(nbResource.Spec.PolicyFriendlyName).To(BeEquivalentTo(map[string]string{"test": "toast", "meow": "meow"})) Expect(nbResource.Spec.PolicyFriendlyName).To(BeEquivalentTo(map[string]string{"test": "toast", "meow": "meow"}))
}) })
}) })
When("policy source groups changes", func() { When("policy source groups changes", func() {
It("should update policy source groups in NBResource spec", func() { It("should update policy source groups in NBResource spec", func() {
nbResource := &netbirdiov1.NBResource{} nbResource := &nbv1.NBResource{}
Expect(k8sClient.Get(ctx, typeNamespacedName, nbResource)).To(Succeed()) Expect(k8sClient.Get(ctx, typeNamespacedName, nbResource)).To(Succeed())
nbResource.Spec.PolicyName = policyName nbResource.Spec.PolicyName = policyName
Expect(k8sClient.Update(ctx, nbResource)).To(Succeed()) Expect(k8sClient.Update(ctx, nbResource)).To(Succeed())
@@ -479,7 +480,7 @@ var _ = Describe("Service Controller", func() {
}) })
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
nbResource = &netbirdiov1.NBResource{} nbResource = &nbv1.NBResource{}
Expect(k8sClient.Get(ctx, typeNamespacedName, nbResource)).To(Succeed()) Expect(k8sClient.Get(ctx, typeNamespacedName, nbResource)).To(Succeed())
Expect(nbResource.Spec.PolicySourceGroups).To(BeEquivalentTo([]string{"test"})) Expect(nbResource.Spec.PolicySourceGroups).To(BeEquivalentTo([]string{"test"}))
}) })
@@ -493,7 +494,7 @@ var _ = Describe("Service Controller", func() {
}) })
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
nbResource := &netbirdiov1.NBResource{} nbResource := &nbv1.NBResource{}
Expect(k8sClient.Get(ctx, typeNamespacedName, nbResource)).To(Succeed()) Expect(k8sClient.Get(ctx, typeNamespacedName, nbResource)).To(Succeed())
Expect(nbResource.Spec.Name).To(Equal("meow")) Expect(nbResource.Spec.Name).To(Equal("meow"))
}) })
@@ -507,7 +508,7 @@ var _ = Describe("Service Controller", func() {
}) })
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
nbResource := &netbirdiov1.NBResource{} nbResource := &nbv1.NBResource{}
Expect(k8sClient.Get(ctx, typeNamespacedName, nbResource)).To(Succeed()) Expect(k8sClient.Get(ctx, typeNamespacedName, nbResource)).To(Succeed())
Expect(nbResource.Spec.Groups).To(ConsistOf([]string{"a7medmo7sen", "pewpewpew"})) Expect(nbResource.Spec.Groups).To(ConsistOf([]string{"a7medmo7sen", "pewpewpew"}))
}) })
+3 -2
View File
@@ -7,8 +7,6 @@ import (
"github.com/fluxcd/pkg/runtime/conditions" "github.com/fluxcd/pkg/runtime/conditions"
"github.com/fluxcd/pkg/runtime/patch" "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" corev1 "k8s.io/api/core/v1"
kerrors "k8s.io/apimachinery/pkg/api/errors" kerrors "k8s.io/apimachinery/pkg/api/errors"
corev1ac "k8s.io/client-go/applyconfigurations/core/v1" corev1ac "k8s.io/client-go/applyconfigurations/core/v1"
@@ -17,6 +15,9 @@ import (
"sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" "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" nbv1alpha1 "github.com/netbirdio/kubernetes-operator/api/v1alpha1"
"github.com/netbirdio/kubernetes-operator/internal/k8sutil" "github.com/netbirdio/kubernetes-operator/internal/k8sutil"
"github.com/netbirdio/kubernetes-operator/internal/netbirdutil" "github.com/netbirdio/kubernetes-operator/internal/netbirdutil"
+6 -9
View File
@@ -24,7 +24,7 @@ import (
. "github.com/onsi/ginkgo/v2" . "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega" . "github.com/onsi/gomega"
corev1 "k8s.io/api/core/v1"
"k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/kubernetes/scheme"
"k8s.io/client-go/rest" "k8s.io/client-go/rest"
"sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client"
@@ -32,11 +32,8 @@ import (
logf "sigs.k8s.io/controller-runtime/pkg/log" logf "sigs.k8s.io/controller-runtime/pkg/log"
"sigs.k8s.io/controller-runtime/pkg/log/zap" "sigs.k8s.io/controller-runtime/pkg/log/zap"
foobarv1 "k8s.io/api/core/v1" nbv1 "github.com/netbirdio/kubernetes-operator/api/v1"
nbv1alpha1 "github.com/netbirdio/kubernetes-operator/api/v1alpha1"
netbirdiov1 "github.com/netbirdio/kubernetes-operator/api/v1"
netbirdiov1alpha1 "github.com/netbirdio/kubernetes-operator/api/v1alpha1"
// +kubebuilder:scaffold:imports
) )
// These tests use Ginkgo (BDD-style Go testing framework). Refer to // These tests use Ginkgo (BDD-style Go testing framework). Refer to
@@ -62,13 +59,13 @@ var _ = BeforeSuite(func() {
ctx, cancel = context.WithCancel(context.TODO()) ctx, cancel = context.WithCancel(context.TODO())
var err error var err error
err = netbirdiov1.AddToScheme(scheme.Scheme) err = nbv1.AddToScheme(scheme.Scheme)
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
err = foobarv1.AddToScheme(scheme.Scheme) err = corev1.AddToScheme(scheme.Scheme)
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
err = netbirdiov1alpha1.AddToScheme(scheme.Scheme) err = nbv1alpha1.AddToScheme(scheme.Scheme)
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
// +kubebuilder:scaffold:scheme // +kubebuilder:scaffold:scheme
+7 -7
View File
@@ -3,6 +3,7 @@ package controller
import ( import (
"context" "context"
"github.com/fluxcd/pkg/runtime/patch"
corev1 "k8s.io/api/core/v1" corev1 "k8s.io/api/core/v1"
kerrors "k8s.io/apimachinery/pkg/api/errors" kerrors "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/api/meta"
@@ -10,10 +11,9 @@ import (
ctrl "sigs.k8s.io/controller-runtime" ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
gatewayv1 "sigs.k8s.io/gateway-api/apis/v1" gwv1 "sigs.k8s.io/gateway-api/apis/v1"
gatewayv1alpha2 "sigs.k8s.io/gateway-api/apis/v1alpha2" gwv1alpha2 "sigs.k8s.io/gateway-api/apis/v1alpha2"
"github.com/fluxcd/pkg/runtime/patch"
nbv1alpha1 "github.com/netbirdio/kubernetes-operator/api/v1alpha1" nbv1alpha1 "github.com/netbirdio/kubernetes-operator/api/v1alpha1"
"github.com/netbirdio/kubernetes-operator/internal/gatewayutil" "github.com/netbirdio/kubernetes-operator/internal/gatewayutil"
"github.com/netbirdio/kubernetes-operator/internal/k8sutil" "github.com/netbirdio/kubernetes-operator/internal/k8sutil"
@@ -28,7 +28,7 @@ type TCPRouteReconciler struct {
func (r *TCPRouteReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { func (r *TCPRouteReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
logger := ctrl.Log.WithName("TCPRoute").WithValues("namespace", req.Namespace, "name", req.Name) logger := ctrl.Log.WithName("TCPRoute").WithValues("namespace", req.Namespace, "name", req.Name)
tr := &gatewayv1alpha2.TCPRoute{} tr := &gwv1alpha2.TCPRoute{}
err := r.Get(ctx, req.NamespacedName, tr) err := r.Get(ctx, req.NamespacedName, tr)
if err != nil { if err != nil {
return ctrl.Result{}, client.IgnoreNotFound(err) return ctrl.Result{}, client.IgnoreNotFound(err)
@@ -47,7 +47,7 @@ func (r *TCPRouteReconciler) Reconcile(ctx context.Context, req ctrl.Request) (c
if gw == nil { if gw == nil {
continue 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) logger.Info("gateway is not ready", "name", gw.ObjectMeta.Name)
continue continue
} }
@@ -102,7 +102,7 @@ func (r *TCPRouteReconciler) Reconcile(ctx context.Context, req ctrl.Request) (c
return ctrl.Result{}, nil return ctrl.Result{}, nil
} }
func (r *TCPRouteReconciler) reconcileDelete(ctx context.Context, sp *patch.SerialPatcher, tr *gatewayv1alpha2.TCPRoute) (ctrl.Result, error) { func (r *TCPRouteReconciler) reconcileDelete(ctx context.Context, sp *patch.SerialPatcher, tr *gwv1alpha2.TCPRoute) (ctrl.Result, error) {
for _, parent := range tr.Spec.ParentRefs { for _, parent := range tr.Spec.ParentRefs {
gw, err := gatewayutil.GetParentGateway(ctx, r.Client, parent, tr.Namespace, GatewayControllerName) gw, err := gatewayutil.GetParentGateway(ctx, r.Client, parent, tr.Namespace, GatewayControllerName)
if err != nil { if err != nil {
@@ -170,6 +170,6 @@ func (r *TCPRouteReconciler) reconcileDelete(ctx context.Context, sp *patch.Seri
// SetupWithManager sets up the controller with the Manager. // SetupWithManager sets up the controller with the Manager.
func (r *TCPRouteReconciler) SetupWithManager(mgr ctrl.Manager) error { func (r *TCPRouteReconciler) SetupWithManager(mgr ctrl.Manager) error {
return ctrl.NewControllerManagedBy(mgr). return ctrl.NewControllerManagedBy(mgr).
For(&gatewayv1alpha2.TCPRoute{}). For(&gwv1alpha2.TCPRoute{}).
Complete(r) Complete(r)
} }
+2 -1
View File
@@ -4,10 +4,11 @@ import (
"context" "context"
"fmt" "fmt"
netbird "github.com/netbirdio/netbird/shared/management/client/rest"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client"
netbird "github.com/netbirdio/netbird/shared/management/client/rest"
nbv1alpha1 "github.com/netbirdio/kubernetes-operator/api/v1alpha1" nbv1alpha1 "github.com/netbirdio/kubernetes-operator/api/v1alpha1"
) )
+10 -10
View File
@@ -11,7 +11,7 @@ import (
logf "sigs.k8s.io/controller-runtime/pkg/log" logf "sigs.k8s.io/controller-runtime/pkg/log"
"sigs.k8s.io/controller-runtime/pkg/webhook/admission" "sigs.k8s.io/controller-runtime/pkg/webhook/admission"
netbirdiov1 "github.com/netbirdio/kubernetes-operator/api/v1" nbv1 "github.com/netbirdio/kubernetes-operator/api/v1"
) )
// nolint:unused // nolint:unused
@@ -20,7 +20,7 @@ var nbgrouplog = logf.Log.WithName("nbgroup-resource")
// SetupNBGroupWebhookWithManager registers the webhook for NBGroup in the manager. // SetupNBGroupWebhookWithManager registers the webhook for NBGroup in the manager.
func SetupNBGroupWebhookWithManager(mgr ctrl.Manager) error { func SetupNBGroupWebhookWithManager(mgr ctrl.Manager) error {
return ctrl.NewWebhookManagedBy(mgr, &netbirdiov1.NBGroup{}). return ctrl.NewWebhookManagedBy(mgr, &nbv1.NBGroup{}).
WithValidator(&NBGroupCustomValidator{client: mgr.GetClient()}). WithValidator(&NBGroupCustomValidator{client: mgr.GetClient()}).
Complete() Complete()
} }
@@ -31,25 +31,25 @@ type NBGroupCustomValidator struct {
client client.Client client client.Client
} }
var _ admission.Validator[*netbirdiov1.NBGroup] = &NBGroupCustomValidator{} var _ admission.Validator[*nbv1.NBGroup] = &NBGroupCustomValidator{}
// ValidateCreate implements webhook.CustomValidator so a webhook will be registered for the type NBGroup. // ValidateCreate implements webhook.CustomValidator so a webhook will be registered for the type NBGroup.
func (v *NBGroupCustomValidator) ValidateCreate(ctx context.Context, group *netbirdiov1.NBGroup) (admission.Warnings, error) { func (v *NBGroupCustomValidator) ValidateCreate(ctx context.Context, group *nbv1.NBGroup) (admission.Warnings, error) {
return nil, nil return nil, nil
} }
// ValidateUpdate implements webhook.CustomValidator so a webhook will be registered for the type NBGroup. // ValidateUpdate implements webhook.CustomValidator so a webhook will be registered for the type NBGroup.
func (v *NBGroupCustomValidator) ValidateUpdate(ctx context.Context, old, new *netbirdiov1.NBGroup) (admission.Warnings, error) { func (v *NBGroupCustomValidator) ValidateUpdate(ctx context.Context, old, new *nbv1.NBGroup) (admission.Warnings, error) {
return nil, nil return nil, nil
} }
// ValidateDelete implements webhook.CustomValidator so a webhook will be registered for the type NBGroup. // ValidateDelete implements webhook.CustomValidator so a webhook will be registered for the type NBGroup.
func (v *NBGroupCustomValidator) ValidateDelete(ctx context.Context, nbgroup *netbirdiov1.NBGroup) (admission.Warnings, error) { func (v *NBGroupCustomValidator) ValidateDelete(ctx context.Context, nbgroup *nbv1.NBGroup) (admission.Warnings, error) {
nbgrouplog.Info("Validation for NBGroup upon deletion", "name", nbgroup.GetName()) nbgrouplog.Info("Validation for NBGroup upon deletion", "name", nbgroup.GetName())
for _, o := range nbgroup.OwnerReferences { for _, o := range nbgroup.OwnerReferences {
if o.Kind == (&netbirdiov1.NBResource{}).Kind { if o.Kind == (&nbv1.NBResource{}).Kind {
var nbResource netbirdiov1.NBResource var nbResource nbv1.NBResource
err := v.client.Get(ctx, types.NamespacedName{Namespace: nbgroup.Namespace, Name: o.Name}, &nbResource) err := v.client.Get(ctx, types.NamespacedName{Namespace: nbgroup.Namespace, Name: o.Name}, &nbResource)
if err != nil && !errors.IsNotFound(err) { if err != nil && !errors.IsNotFound(err) {
return nil, err return nil, err
@@ -58,8 +58,8 @@ func (v *NBGroupCustomValidator) ValidateDelete(ctx context.Context, nbgroup *ne
return nil, fmt.Errorf("group attached to NBResource %s/%s", nbgroup.Namespace, o.Name) return nil, fmt.Errorf("group attached to NBResource %s/%s", nbgroup.Namespace, o.Name)
} }
} }
if o.Kind == (&netbirdiov1.NBRoutingPeer{}).Kind { if o.Kind == (&nbv1.NBRoutingPeer{}).Kind {
var nbResource netbirdiov1.NBRoutingPeer var nbResource nbv1.NBRoutingPeer
err := v.client.Get(ctx, types.NamespacedName{Namespace: nbgroup.Namespace, Name: o.Name}, &nbResource) err := v.client.Get(ctx, types.NamespacedName{Namespace: nbgroup.Namespace, Name: o.Name}, &nbResource)
if err != nil && !errors.IsNotFound(err) { if err != nil && !errors.IsNotFound(err) {
return nil, err return nil, err
+28 -28
View File
@@ -4,22 +4,22 @@ import (
. "github.com/onsi/ginkgo/v2" . "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega" . "github.com/onsi/gomega"
"k8s.io/apimachinery/pkg/api/errors" "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" "k8s.io/apimachinery/pkg/types"
netbirdiov1 "github.com/netbirdio/kubernetes-operator/api/v1" nbv1 "github.com/netbirdio/kubernetes-operator/api/v1"
) )
var _ = Describe("NBGroup Webhook", func() { var _ = Describe("NBGroup Webhook", func() {
var ( var (
obj *netbirdiov1.NBGroup obj *nbv1.NBGroup
oldObj *netbirdiov1.NBGroup oldObj *nbv1.NBGroup
validator NBGroupCustomValidator validator NBGroupCustomValidator
) )
BeforeEach(func() { BeforeEach(func() {
obj = &netbirdiov1.NBGroup{} obj = &nbv1.NBGroup{}
oldObj = &netbirdiov1.NBGroup{} oldObj = &nbv1.NBGroup{}
validator = NBGroupCustomValidator{ validator = NBGroupCustomValidator{
client: k8sClient, client: k8sClient,
} }
@@ -40,8 +40,8 @@ var _ = Describe("NBGroup Webhook", func() {
}) })
When("There are no owners", func() { When("There are no owners", func() {
It("should allow deletion", func() { It("should allow deletion", func() {
obj = &netbirdiov1.NBGroup{ obj = &nbv1.NBGroup{
ObjectMeta: v1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "test", Name: "test",
Namespace: "default", Namespace: "default",
OwnerReferences: nil, OwnerReferences: nil,
@@ -52,13 +52,13 @@ var _ = Describe("NBGroup Webhook", func() {
}) })
When("There deleted owners", func() { When("There deleted owners", func() {
It("should allow deletion", func() { It("should allow deletion", func() {
obj = &netbirdiov1.NBGroup{ obj = &nbv1.NBGroup{
ObjectMeta: v1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "test", Name: "test",
Namespace: "default", Namespace: "default",
OwnerReferences: []v1.OwnerReference{ OwnerReferences: []metav1.OwnerReference{
{ {
APIVersion: netbirdiov1.GroupVersion.Identifier(), APIVersion: nbv1.GroupVersion.Identifier(),
Kind: "NBResource", Kind: "NBResource",
Name: "notexist", Name: "notexist",
UID: obj.UID, UID: obj.UID,
@@ -71,12 +71,12 @@ var _ = Describe("NBGroup Webhook", func() {
}) })
When("NBResource owner exists", func() { When("NBResource owner exists", func() {
BeforeEach(func() { BeforeEach(func() {
nbResource := &netbirdiov1.NBResource{ nbResource := &nbv1.NBResource{
ObjectMeta: v1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "isexist", Name: "isexist",
Namespace: "default", Namespace: "default",
}, },
Spec: netbirdiov1.NBResourceSpec{ Spec: nbv1.NBResourceSpec{
Name: "test1", Name: "test1",
NetworkID: "test2", NetworkID: "test2",
Address: "test3", Address: "test3",
@@ -86,13 +86,13 @@ var _ = Describe("NBGroup Webhook", func() {
Expect(k8sClient.Create(ctx, nbResource)).To(Succeed()) Expect(k8sClient.Create(ctx, nbResource)).To(Succeed())
obj = &netbirdiov1.NBGroup{ obj = &nbv1.NBGroup{
ObjectMeta: v1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "test", Name: "test",
Namespace: "default", Namespace: "default",
OwnerReferences: []v1.OwnerReference{ OwnerReferences: []metav1.OwnerReference{
{ {
APIVersion: netbirdiov1.GroupVersion.Identifier(), APIVersion: nbv1.GroupVersion.Identifier(),
Kind: nbResource.Kind, Kind: nbResource.Kind,
Name: nbResource.Name, Name: nbResource.Name,
UID: nbResource.UID, UID: nbResource.UID,
@@ -102,7 +102,7 @@ var _ = Describe("NBGroup Webhook", func() {
} }
}) })
AfterEach(func() { AfterEach(func() {
nbResource := &netbirdiov1.NBResource{} nbResource := &nbv1.NBResource{}
err := k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "isexist"}, nbResource) err := k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "isexist"}, nbResource)
if !errors.IsNotFound(err) { if !errors.IsNotFound(err) {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
@@ -122,23 +122,23 @@ var _ = Describe("NBGroup Webhook", func() {
}) })
When("NBRoutingPeer owner exists", func() { When("NBRoutingPeer owner exists", func() {
BeforeEach(func() { BeforeEach(func() {
nbrp := &netbirdiov1.NBRoutingPeer{ nbrp := &nbv1.NBRoutingPeer{
ObjectMeta: v1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "isexist", Name: "isexist",
Namespace: "default", Namespace: "default",
}, },
Spec: netbirdiov1.NBRoutingPeerSpec{}, Spec: nbv1.NBRoutingPeerSpec{},
} }
Expect(k8sClient.Create(ctx, nbrp)).To(Succeed()) Expect(k8sClient.Create(ctx, nbrp)).To(Succeed())
obj = &netbirdiov1.NBGroup{ obj = &nbv1.NBGroup{
ObjectMeta: v1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "test", Name: "test",
Namespace: "default", Namespace: "default",
OwnerReferences: []v1.OwnerReference{ OwnerReferences: []metav1.OwnerReference{
{ {
APIVersion: netbirdiov1.GroupVersion.Identifier(), APIVersion: nbv1.GroupVersion.Identifier(),
Kind: nbrp.Kind, Kind: nbrp.Kind,
Name: nbrp.Name, Name: nbrp.Name,
UID: nbrp.UID, UID: nbrp.UID,
@@ -148,7 +148,7 @@ var _ = Describe("NBGroup Webhook", func() {
} }
}) })
AfterEach(func() { AfterEach(func() {
nbrp := &netbirdiov1.NBRoutingPeer{} nbrp := &nbv1.NBRoutingPeer{}
err := k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "isexist"}, nbrp) err := k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "isexist"}, nbrp)
if !errors.IsNotFound(err) { if !errors.IsNotFound(err) {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
+3 -3
View File
@@ -34,7 +34,7 @@ import (
logf "sigs.k8s.io/controller-runtime/pkg/log" logf "sigs.k8s.io/controller-runtime/pkg/log"
"sigs.k8s.io/controller-runtime/pkg/webhook/admission" "sigs.k8s.io/controller-runtime/pkg/webhook/admission"
netbirdiov1 "github.com/netbirdio/kubernetes-operator/api/v1" nbv1 "github.com/netbirdio/kubernetes-operator/api/v1"
nbv1alpha1 "github.com/netbirdio/kubernetes-operator/api/v1alpha1" nbv1alpha1 "github.com/netbirdio/kubernetes-operator/api/v1alpha1"
"github.com/netbirdio/kubernetes-operator/internal/controller" "github.com/netbirdio/kubernetes-operator/internal/controller"
) )
@@ -195,7 +195,7 @@ func (d *PodNetbirdInjector) legacyInjector(ctx context.Context, pod *corev1.Pod
podlog.Info("Defaulting for Pod", "name", pod.GetName()) podlog.Info("Defaulting for Pod", "name", pod.GetName())
// retrieve the NBSetupKey resource // retrieve the NBSetupKey resource
var nbSetupKey netbirdiov1.NBSetupKey var nbSetupKey nbv1.NBSetupKey
err := d.client.Get(ctx, types.NamespacedName{Namespace: pod.Namespace, Name: pod.Annotations[setupKeyAnnotation]}, &nbSetupKey) err := d.client.Get(ctx, types.NamespacedName{Namespace: pod.Namespace, Name: pod.Annotations[setupKeyAnnotation]}, &nbSetupKey)
if err != nil { if err != nil {
return err return err
@@ -204,7 +204,7 @@ func (d *PodNetbirdInjector) legacyInjector(ctx context.Context, pod *corev1.Pod
// ensure the NBSetupKey is ready. // ensure the NBSetupKey is ready.
ready := false ready := false
for _, c := range nbSetupKey.Status.Conditions { for _, c := range nbSetupKey.Status.Conditions {
if c.Type == netbirdiov1.NBSetupKeyReady { if c.Type == nbv1.NBSetupKeyReady {
ready = c.Status == corev1.ConditionTrue ready = c.Status == corev1.ConditionTrue
} }
} }
+8 -7
View File
@@ -19,12 +19,13 @@ package v1
import ( import (
"context" "context"
netbirdiov1 "github.com/netbirdio/kubernetes-operator/api/v1"
nbv1alpha1 "github.com/netbirdio/kubernetes-operator/api/v1alpha1"
. "github.com/onsi/ginkgo/v2" . "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega" . "github.com/onsi/gomega"
corev1 "k8s.io/api/core/v1" corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
nbv1 "github.com/netbirdio/kubernetes-operator/api/v1"
nbv1alpha1 "github.com/netbirdio/kubernetes-operator/api/v1alpha1"
) )
var _ = Describe("Pod Webhook", func() { var _ = Describe("Pod Webhook", func() {
@@ -82,12 +83,12 @@ var _ = Describe("Pod Webhook", func() {
When("NBSetupKey exists", Ordered, func() { When("NBSetupKey exists", Ordered, func() {
BeforeAll(func() { BeforeAll(func() {
sk := netbirdiov1.NBSetupKey{ sk := nbv1.NBSetupKey{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "test", Name: "test",
Namespace: "test", Namespace: "test",
}, },
Spec: netbirdiov1.NBSetupKeySpec{ Spec: nbv1.NBSetupKeySpec{
SecretKeyRef: corev1.SecretKeySelector{ SecretKeyRef: corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{ LocalObjectReference: corev1.LocalObjectReference{
Name: "test", Name: "test",
@@ -107,10 +108,10 @@ var _ = Describe("Pod Webhook", func() {
err = k8sClient.Create(context.Background(), &sk) err = k8sClient.Create(context.Background(), &sk)
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
sk.Status = netbirdiov1.NBSetupKeyStatus{ sk.Status = nbv1.NBSetupKeyStatus{
Conditions: []netbirdiov1.NBCondition{ Conditions: []nbv1.NBCondition{
{ {
Type: netbirdiov1.NBSetupKeyReady, Type: nbv1.NBSetupKeyReady,
Status: corev1.ConditionTrue, Status: corev1.ConditionTrue,
}, },
}, },
+4 -6
View File
@@ -28,9 +28,8 @@ import (
. "github.com/onsi/ginkgo/v2" . "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega" . "github.com/onsi/gomega"
admissionv1 "k8s.io/api/admission/v1" admissionv1 "k8s.io/api/admission/v1"
k8siov1 "k8s.io/api/core/v1" corev1 "k8s.io/api/core/v1"
apimachineryruntime "k8s.io/apimachinery/pkg/runtime" apimachineryruntime "k8s.io/apimachinery/pkg/runtime"
"k8s.io/client-go/rest" "k8s.io/client-go/rest"
ctrl "sigs.k8s.io/controller-runtime" ctrl "sigs.k8s.io/controller-runtime"
@@ -41,9 +40,8 @@ import (
metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server" metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server"
"sigs.k8s.io/controller-runtime/pkg/webhook" "sigs.k8s.io/controller-runtime/pkg/webhook"
netbirdiov1 "github.com/netbirdio/kubernetes-operator/api/v1" nbv1 "github.com/netbirdio/kubernetes-operator/api/v1"
nbv1alpha1 "github.com/netbirdio/kubernetes-operator/api/v1alpha1" nbv1alpha1 "github.com/netbirdio/kubernetes-operator/api/v1alpha1"
// +kubebuilder:scaffold:imports
) )
// These tests use Ginkgo (BDD-style Go testing framework). Refer to // These tests use Ginkgo (BDD-style Go testing framework). Refer to
@@ -70,13 +68,13 @@ var _ = BeforeSuite(func() {
var err error var err error
scheme := apimachineryruntime.NewScheme() scheme := apimachineryruntime.NewScheme()
err = k8siov1.AddToScheme(scheme) err = corev1.AddToScheme(scheme)
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
err = admissionv1.AddToScheme(scheme) err = admissionv1.AddToScheme(scheme)
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
err = netbirdiov1.AddToScheme(scheme) err = nbv1.AddToScheme(scheme)
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
err = nbv1alpha1.AddToScheme(scheme) err = nbv1alpha1.AddToScheme(scheme)