@@ -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