@@ -38,12 +38,11 @@ import (
3838 "k8s.io/client-go/tools/record"
3939 ctrl "sigs.k8s.io/controller-runtime"
4040 "sigs.k8s.io/controller-runtime/pkg/client"
41- "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
4241 "sigs.k8s.io/controller-runtime/pkg/log"
4342)
4443
4544const IpRangeFinalizerName = "iprange.netbox.dev/finalizer"
46- const LastIpRangeMetadataAnnotationName = "iprange.netbox.dev/last-ip-range-metadata "
45+ const LastIpRangeManagedCustomFieldsAnnotationName = "iprange.netbox.dev/managed-custom-fields "
4746
4847// IpRangeReconciler reconciles a IpRange object
4948type IpRangeReconciler struct {
@@ -58,6 +57,7 @@ type IpRangeReconciler struct {
5857//+kubebuilder:rbac:groups=netbox.dev,resources=ipranges,verbs=get;list;watch;create;update;patch;delete
5958//+kubebuilder:rbac:groups=netbox.dev,resources=ipranges/status,verbs=get;update;patch
6059//+kubebuilder:rbac:groups=netbox.dev,resources=ipranges/finalizers,verbs=update
60+ //+kubebuilder:rbac:groups=core,resources=events,verbs=create;patch
6161
6262// Reconcile is part of the main kubernetes reconciliation loop which aims to
6363// move the current state of the cluster closer to the desired state.
@@ -74,43 +74,25 @@ func (r *IpRangeReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
7474
7575 // if being deleted
7676 if ! o .ObjectMeta .DeletionTimestamp .IsZero () {
77- if o .Spec .PreserveInNetbox {
78- // if there's a finalizer remove it and return
79- // this can be the case if a CR used to have spec.preserveInNetbox set to false
80- return ctrl.Result {}, r .removeFinalizer (ctx , o )
81- }
82-
83- err := r .NetboxClient .DeleteIpRange (o .Status .IpRangeId )
84- if err != nil {
85- err = r .logErrorSetConditionAndCreateEvent (ctx , o , netboxv1 .ConditionIpRangeReadyFalseDeletionFailed ,
86- corev1 .EventTypeWarning , "" , err )
77+ if ! o .Spec .PreserveInNetbox {
78+ err := r .NetboxClient .DeleteIpRange (o .Status .IpRangeId )
8779 if err != nil {
88- return ctrl.Result {}, err
89- }
80+ err = r .logErrorSetConditionAndCreateEvent (ctx , o , netboxv1 .ConditionIpRangeReadyFalseDeletionFailed ,
81+ corev1 .EventTypeWarning , "" , err )
82+ if err != nil {
83+ return ctrl.Result {}, err
84+ }
9085
91- return ctrl.Result {Requeue : true }, nil
92- }
93-
94- err = r .removeFinalizer (ctx , o )
95- if err != nil {
96- return ctrl.Result {}, err
97- }
98-
99- err = r .Update (ctx , o )
100- if err != nil {
101- return ctrl.Result {}, err
86+ return ctrl.Result {Requeue : true }, nil
87+ }
10288 }
10389
104- return ctrl.Result {}, nil
90+ return ctrl.Result {}, removeFinalizer ( ctx , r . Client , o , IpRangeFinalizerName )
10591 }
10692
10793 // if PreserveIpInNetbox flag is false then register finalizer if not yet registered
108- if ! o .Spec .PreserveInNetbox && ! controllerutil .ContainsFinalizer (o , IpRangeFinalizerName ) {
109- logger .V (4 ).Info ("adding the finalizer" )
110- controllerutil .AddFinalizer (o , IpRangeFinalizerName )
111- if err := r .Update (ctx , o ); err != nil {
112- return ctrl.Result {}, err
113- }
94+ if ! o .Spec .PreserveInNetbox {
95+ err = addFinalizer (ctx , r .Client , o , IpRangeFinalizerName )
11496 }
11597
11698 // 1. try to lock lease of parent prefix if IpRange status condition is not true
@@ -119,24 +101,12 @@ func (r *IpRangeReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
119101 var ll * leaselocker.LeaseLocker
120102 if len (or ) > 0 && ! apismeta .IsStatusConditionTrue (o .Status .Conditions , "Ready" ) {
121103
122- // determine NamespacedName of IpRangeClaim owning the IpRange CR
123- orLookupKey := types.NamespacedName {
124- Name : o .ObjectMeta .OwnerReferences [0 ].Name ,
125- Namespace : o .Namespace ,
126- }
127-
128- ipRangeClaim := & netboxv1.IpRangeClaim {}
129- err := r .Client .Get (ctx , orLookupKey , ipRangeClaim )
104+ leaseLockerNSN , owner , parentPrefix , err := r .getLeaseLockerNSNandOwner (ctx , o )
130105 if err != nil {
131106 return ctrl.Result {}, err
132107 }
133108
134- // get name of parent prefix
135- leaseLockerNSN := types.NamespacedName {
136- Name : convertCIDRToLeaseLockName (ipRangeClaim .Spec .ParentPrefix ),
137- Namespace : r .OperatorNamespace ,
138- }
139- ll , err = leaselocker .NewLeaseLocker (r .RestConfig , leaseLockerNSN , orLookupKey .String ())
109+ ll , err = leaselocker .NewLeaseLocker (r .RestConfig , leaseLockerNSN , owner )
140110 if err != nil {
141111 return ctrl.Result {}, err
142112 }
@@ -147,12 +117,12 @@ func (r *IpRangeReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
147117 // create lock
148118 locked := ll .TryLock (lockCtx )
149119 if ! locked {
150- logger .Info (fmt .Sprintf ("failed to lock parent prefix %s" , ipRangeClaim . Spec . ParentPrefix ))
120+ logger .Info (fmt .Sprintf ("failed to lock parent prefix %s" , parentPrefix ))
151121 r .Recorder .Eventf (o , corev1 .EventTypeWarning , "FailedToLockParentPrefix" , "failed to lock parent prefix %s" ,
152- ipRangeClaim . Spec . ParentPrefix )
122+ parentPrefix )
153123 return ctrl.Result {Requeue : true }, nil
154124 }
155- logger .V (4 ).Info (fmt .Sprintf ("successfully locked parent prefix %s" , ipRangeClaim . Spec . ParentPrefix ))
125+ logger .V (4 ).Info (fmt .Sprintf ("successfully locked parent prefix %s" , parentPrefix ))
156126 }
157127
158128 // 2. reserve or update ip range in netbox
@@ -162,15 +132,15 @@ func (r *IpRangeReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
162132 return ctrl.Result {}, err
163133 }
164134
165- ipRangeModel , err := r .generateNetboxIpRangeModelFromIpRangeSpec (o , req , annotations [LastIpRangeMetadataAnnotationName ])
135+ ipRangeModel , err := r .generateNetboxIpRangeModelFromIpRangeSpec (o , req , annotations [LastIpRangeManagedCustomFieldsAnnotationName ])
166136 if err != nil {
167137 return ctrl.Result {}, err
168138 }
169139
170140 netboxIpRangeModel , err := r .NetboxClient .ReserveOrUpdateIpRange (ipRangeModel )
171141 if err != nil {
172142 err := r .logErrorSetConditionAndCreateEvent (ctx , o , netboxv1 .ConditionIpRangeReadyFalse ,
173- corev1 .EventTypeWarning , fmt .Sprintf ("%s-%s" , o .Spec .StartAddress , o .Spec .EndAddress ), err )
143+ corev1 .EventTypeWarning , fmt .Sprintf ("%s-%s " , o .Spec .StartAddress , o .Spec .EndAddress ), err )
174144 if err != nil {
175145 return ctrl.Result {}, err
176146 }
@@ -189,7 +159,11 @@ func (r *IpRangeReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
189159 return ctrl.Result {}, err
190160 }
191161
192- annotations , err = updateLastMetadataAnnotation (annotations , o .Spec .CustomFields )
162+ if annotations == nil {
163+ annotations = make (map [string ]string , 1 )
164+ }
165+
166+ annotations [LastIpRangeManagedCustomFieldsAnnotationName ], err = generateLastMetadataAnnotation (o .Spec .CustomFields )
193167 if err != nil {
194168 logger .Error (err , "failed to update last metadata annotation" )
195169 return ctrl.Result {Requeue : true }, nil
@@ -287,15 +261,24 @@ func (r *IpRangeReconciler) generateNetboxIpRangeModelFromIpRangeSpec(o *netboxv
287261 }, nil
288262}
289263
290- func (r * IpRangeReconciler ) removeFinalizer (ctx context.Context , o * netboxv1.IpRange ) error {
291- logger := log .FromContext (ctx )
292- if controllerutil .ContainsFinalizer (o , IpRangeFinalizerName ) {
293- logger .V (4 ).Info ("removing the finalizer" )
294- controllerutil .RemoveFinalizer (o , IpRangeFinalizerName )
295- if err := r .Update (ctx , o ); err != nil {
296- return err
297- }
264+ func (r * IpRangeReconciler ) getLeaseLockerNSNandOwner (ctx context.Context , o * netboxv1.IpRange ) (types.NamespacedName , string , string , error ) {
265+
266+ orLookupKey := types.NamespacedName {
267+ Name : o .ObjectMeta .OwnerReferences [0 ].Name ,
268+ Namespace : o .Namespace ,
269+ }
270+
271+ ipRangeClaim := & netboxv1.IpRangeClaim {}
272+ err := r .Client .Get (ctx , orLookupKey , ipRangeClaim )
273+ if err != nil {
274+ return types.NamespacedName {}, "" , "" , err
275+ }
276+
277+ // get name of parent prefix
278+ leaseLockerNSN := types.NamespacedName {
279+ Name : convertCIDRToLeaseLockName (ipRangeClaim .Spec .ParentPrefix ),
280+ Namespace : r .OperatorNamespace ,
298281 }
299282
300- return nil
283+ return leaseLockerNSN , orLookupKey . String (), ipRangeClaim . Spec . ParentPrefix , nil
301284}
0 commit comments