Skip to content

Commit 549e32a

Browse files
committed
add unit tests
1 parent 7204b59 commit 549e32a

19 files changed

+899
-236
lines changed

api/v1/ipaddressclaim_types.go

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -117,10 +117,3 @@ var ConditionIpAssignedFalse = metav1.Condition{
117117
Reason: "IPAddressCRNotCreated",
118118
Message: "Failed to fetch new IP from NetBox",
119119
}
120-
121-
var ConditionIpAssignedFalseSizeMissmatch = metav1.Condition{
122-
Type: "IPAssigned",
123-
Status: "False",
124-
Reason: "IPAddressCRNotCreated",
125-
Message: "Size of restored IpRange does not match the requested size",
126-
}

api/v1/iprange_types.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,13 @@ import (
2525

2626
// IpRangeSpec defines the desired state of IpRange
2727
type IpRangeSpec struct {
28+
// the startAddress is the first ip address included in the ip range
2829
//+kubebuilder:validation:Format=cidr
2930
//+kubebuilder:validation:XValidation:rule="self == oldSelf",message="Field 'startAddress' is immutable"
3031
//+kubebuilder:validation:Required
3132
StartAddress string `json:"startAddress"`
3233

34+
// the endAddress is the last ip address included in the ip range
3335
//+kubebuilder:validation:Format=cidr
3436
//+kubebuilder:validation:XValidation:rule="self == oldSelf",message="Field 'endAddress' is immutable"
3537
//+kubebuilder:validation:Required
@@ -92,20 +94,20 @@ func init() {
9294
var ConditionIpRangeReadyTrue = metav1.Condition{
9395
Type: "Ready",
9496
Status: "True",
95-
Reason: "IpReservedInNetbox",
96-
Message: "IP was reserved/updated in NetBox",
97+
Reason: "IpRangeReservedInNetbox",
98+
Message: "Ip Range was reserved/updated in NetBox",
9799
}
98100

99101
var ConditionIpRangeReadyFalse = metav1.Condition{
100102
Type: "Ready",
101103
Status: "False",
102-
Reason: "FailedToReserveIpInNetbox",
103-
Message: "Failed to reserve IP Range in NetBox",
104+
Reason: "FailedToReserveIpRangeInNetbox",
105+
Message: "Failed to reserve Ip Range in NetBox",
104106
}
105107

106108
var ConditionIpRangeReadyFalseDeletionFailed = metav1.Condition{
107109
Type: "Ready",
108110
Status: "False",
109-
Reason: "FailedToDeleteIpInNetbox",
110-
Message: "Failed to delete IP Range in NetBox",
111+
Reason: "FailedToDeleteIpRangeInNetbox",
112+
Message: "Failed to delete Ip Range in NetBox",
111113
}

api/v1/iprangeclaim_types.go

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -90,27 +90,34 @@ func init() {
9090
var ConditionIpRangeClaimReadyTrue = metav1.Condition{
9191
Type: "Ready",
9292
Status: "True",
93-
Reason: "IPAddressResourceReady",
94-
Message: "IPAddress Resource is ready",
93+
Reason: "IpRangeResourceReady",
94+
Message: "Ip Range Resource is ready",
9595
}
9696

9797
var ConditionIpRangeClaimReadyFalse = metav1.Condition{
9898
Type: "Ready",
9999
Status: "False",
100-
Reason: "IPAddressResourceNotReady",
101-
Message: "IPAddress Resource is not ready",
100+
Reason: "IpRangeResourceNotReady",
101+
Message: "Ip Range Resource is not ready",
102102
}
103103

104104
var ConditionIpRangeAssignedTrue = metav1.Condition{
105-
Type: "IPAssigned",
105+
Type: "IpRangeAssigned",
106106
Status: "True",
107-
Reason: "IPAddressCRCreated",
108-
Message: "New IP fetched from NetBox and IPAddress CR was created",
107+
Reason: "IpRangeCRCreated",
108+
Message: "New Ip Range fetched from NetBox and IpRange CR was created",
109109
}
110110

111111
var ConditionIpRangeAssignedFalse = metav1.Condition{
112-
Type: "IPAssigned",
112+
Type: "IpRangeAssigned",
113113
Status: "False",
114-
Reason: "IPAddressCRNotCreated",
115-
Message: "Failed to fetch new IP from NetBox",
114+
Reason: "IpRangeCRNotCreated",
115+
Message: "Failed to fetch new Ip Range from NetBox",
116+
}
117+
118+
var ConditionIpAssignedFalseSizeMissmatch = metav1.Condition{
119+
Type: "IpRangeAssigned",
120+
Status: "False",
121+
Reason: "IpRangeCRNotCreated",
122+
Message: "Size of restored IpRange does not match the requested size",
116123
}

config/crd/bases/netbox.dev_iprangeclaims.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ spec:
1212
listKind: IpRangeClaimList
1313
plural: iprangeclaims
1414
shortNames:
15-
- iprc
15+
- irc
1616
singular: iprangeclaim
1717
scope: Namespaced
1818
versions:

config/crd/bases/netbox.dev_ipranges.yaml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ spec:
1212
listKind: IpRangeList
1313
plural: ipranges
1414
shortNames:
15-
- ipr
15+
- ir
1616
singular: iprange
1717
scope: Namespaced
1818
versions:
@@ -69,6 +69,8 @@ spec:
6969
description:
7070
type: string
7171
endAddress:
72+
description: the endAddress is the last ip address included in the
73+
ip range
7274
format: cidr
7375
type: string
7476
x-kubernetes-validations:
@@ -77,6 +79,8 @@ spec:
7779
preserveInNetbox:
7880
type: boolean
7981
startAddress:
82+
description: the startAddress is the first ip address included in
83+
the ip range
8084
format: cidr
8185
type: string
8286
x-kubernetes-validations:

internal/controller/iprange_controller.go

Lines changed: 24 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ func (r *IpRangeReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
7878
if o.Spec.PreserveInNetbox {
7979
// if there's a finalizer remove it and return
8080
// this can be the case if a CR used to have spec.preserveInNetbox set to false
81-
return r.removeFinalizer(ctx, o)
81+
return ctrl.Result{}, r.removeFinalizer(ctx, o)
8282
}
8383

8484
return r.deleteFromNetboxAndRemoveFinalizer(ctx, o)
@@ -96,13 +96,9 @@ func (r *IpRangeReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
9696
// 1. try to lock lease of parent prefix if IpRange status condition is not true
9797
// and IpRange is owned by an IpRangeClaim
9898
or := o.ObjectMeta.OwnerReferences
99+
var ll *leaselocker.LeaseLocker
99100
if len(or) > 0 /* len(nil array) = 0 */ && !apismeta.IsStatusConditionTrue(o.Status.Conditions, "Ready") {
100-
ll, res, err := r.tryLockOnParentPrefix(ctx, o)
101-
defer func() {
102-
if ll != nil {
103-
ll.Unlock()
104-
}
105-
}()
101+
res, err := r.tryLockOnParentPrefix(ctx, ll, o)
106102
if err != nil {
107103
return res, err
108104
}
@@ -129,6 +125,11 @@ func (r *IpRangeReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
129125
}
130126
}
131127

128+
// 3. unlock lease of parent prefix
129+
if ll != nil {
130+
ll.Unlock()
131+
}
132+
132133
// 4. update status fields
133134
o.Status.IpRangeId = netboxIpRangeModel.ID
134135
o.Status.IpRangeUrl = config.GetBaseUrl() + "/ipam/ip-ranges/" + strconv.FormatInt(netboxIpRangeModel.ID, 10)
@@ -185,7 +186,7 @@ func (r *IpRangeReconciler) SetConditionAndCreateEvent(ctx context.Context, o *n
185186
}
186187

187188
func (r *IpRangeReconciler) generateNetboxIpRangeModelFromIpRangeSpec(ctx context.Context, o *netboxv1.IpRange, req ctrl.Request, lastIpRangeMetadata string) (*models.IpRange, error) {
188-
debugLogger := log.FromContext(context.Background()).V(4)
189+
debugLogger := log.FromContext(ctx).V(4)
189190
// unmarshal lastIpRangeMetadata json string to map[string]string
190191
lastAppliedCustomFields := make(map[string]string)
191192
if lastIpRangeMetadata != "" {
@@ -242,9 +243,9 @@ func (r *IpRangeReconciler) deleteFromNetboxAndRemoveFinalizer(ctx context.Conte
242243
return ctrl.Result{Requeue: true}, nil
243244
}
244245

245-
res, err := r.removeFinalizer(ctx, o)
246+
err = r.removeFinalizer(ctx, o)
246247
if err != nil {
247-
return res, err
248+
return ctrl.Result{}, err
248249
}
249250

250251
err = r.Update(ctx, o)
@@ -255,30 +256,30 @@ func (r *IpRangeReconciler) deleteFromNetboxAndRemoveFinalizer(ctx context.Conte
255256
return ctrl.Result{}, nil
256257
}
257258

258-
func (r *IpRangeReconciler) tryLockOnParentPrefix(ctx context.Context, o *netboxv1.IpRange) (*leaselocker.LeaseLocker, ctrl.Result, error) {
259+
func (r *IpRangeReconciler) tryLockOnParentPrefix(ctx context.Context, ll *leaselocker.LeaseLocker, o *netboxv1.IpRange) (ctrl.Result, error) {
260+
logger := log.FromContext(ctx)
261+
debugLogger := log.FromContext(ctx).V(4)
262+
259263
// determine NamespacedName of IpRangeClaim owning the IpRange CR
260264
orLookupKey := types.NamespacedName{
261265
Name: o.ObjectMeta.OwnerReferences[0].Name,
262266
Namespace: o.Namespace,
263267
}
264268

265-
logger := log.FromContext(ctx)
266-
debugLogger := log.FromContext(ctx).V(4)
267-
268269
ipRangeClaim := &netboxv1.IpRangeClaim{}
269270
err := r.Client.Get(ctx, orLookupKey, ipRangeClaim)
270271
if err != nil {
271-
return nil, ctrl.Result{}, err
272+
return ctrl.Result{}, err
272273
}
273274

274275
// get name of parent prefix
275276
leaseLockerNSN := types.NamespacedName{
276277
Name: convertCIDRToLeaseLockName(ipRangeClaim.Spec.ParentPrefix),
277278
Namespace: r.OperatorNamespace,
278279
}
279-
ll, err := leaselocker.NewLeaseLocker(r.RestConfig, leaseLockerNSN, orLookupKey.String())
280+
ll, err = leaselocker.NewLeaseLocker(r.RestConfig, leaseLockerNSN, orLookupKey.String())
280281
if err != nil {
281-
return nil, ctrl.Result{}, err
282+
return ctrl.Result{}, err
282283
}
283284

284285
lockCtx, cancel := context.WithCancel(ctx)
@@ -290,11 +291,11 @@ func (r *IpRangeReconciler) tryLockOnParentPrefix(ctx context.Context, o *netbox
290291
logger.Info(fmt.Sprintf("failed to lock parent prefix %s", ipRangeClaim.Spec.ParentPrefix))
291292
r.Recorder.Eventf(o, corev1.EventTypeWarning, "FailedToLockParentPrefix", "failed to lock parent prefix %s",
292293
ipRangeClaim.Spec.ParentPrefix)
293-
return ll, ctrl.Result{}, nil
294+
return ctrl.Result{}, nil
294295
}
295296
debugLogger.Info(fmt.Sprintf("successfully locked parent prefix %s", ipRangeClaim.Spec.ParentPrefix))
296297

297-
return ll, ctrl.Result{}, nil
298+
return ctrl.Result{}, nil
298299
}
299300

300301
func (r *IpRangeReconciler) updateLastMetadataAnnotation(ctx context.Context, annotations map[string]string, o *netboxv1.IpRange, accessor apismeta.MetadataAccessor) error {
@@ -320,22 +321,18 @@ func (r *IpRangeReconciler) updateLastMetadataAnnotation(ctx context.Context, an
320321
}
321322

322323
// update object to store lastIpRangeMetadata annotation
323-
if err := r.Update(ctx, o); err != nil {
324-
return err
325-
}
326-
327-
return nil
324+
return r.Update(ctx, o)
328325
}
329326

330-
func (r *IpRangeReconciler) removeFinalizer(ctx context.Context, o *netboxv1.IpRange) (ctrl.Result, error) {
327+
func (r *IpRangeReconciler) removeFinalizer(ctx context.Context, o *netboxv1.IpRange) error {
331328
debugLogger := log.FromContext(ctx).V(4)
332329
if controllerutil.ContainsFinalizer(o, IpRangeFinalizerName) {
333330
debugLogger.Info("removing the finalizer")
334331
controllerutil.RemoveFinalizer(o, IpRangeFinalizerName)
335332
if err := r.Update(ctx, o); err != nil {
336-
return ctrl.Result{}, err
333+
return err
337334
}
338335
}
339336

340-
return ctrl.Result{}, nil
337+
return nil
341338
}

internal/controller/iprange_controller_test.go

Lines changed: 56 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -16,69 +16,69 @@ limitations under the License.
1616

1717
package controller
1818

19-
import (
20-
"context"
19+
// import (
20+
// "context"
2121

22-
. "github.com/onsi/ginkgo/v2"
23-
. "github.com/onsi/gomega"
24-
"k8s.io/apimachinery/pkg/api/errors"
25-
"k8s.io/apimachinery/pkg/types"
26-
"sigs.k8s.io/controller-runtime/pkg/reconcile"
22+
// . "github.com/onsi/ginkgo/v2"
23+
// . "github.com/onsi/gomega"
24+
// "k8s.io/apimachinery/pkg/api/errors"
25+
// "k8s.io/apimachinery/pkg/types"
26+
// "sigs.k8s.io/controller-runtime/pkg/reconcile"
2727

28-
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
28+
// metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2929

30-
netboxdevv1 "github.com/netbox-community/netbox-operator/api/v1"
31-
)
30+
// netboxdevv1 "github.com/netbox-community/netbox-operator/api/v1"
31+
// )
3232

33-
var _ = Describe("IpRange Controller", func() {
34-
Context("When reconciling a resource", func() {
35-
const resourceName = "test-resource"
33+
// var _ = Describe("IpRange Controller", func() {
34+
// Context("When reconciling a resource", func() {
35+
// const resourceName = "test-resource"
3636

37-
ctx := context.Background()
37+
// ctx := context.Background()
3838

39-
typeNamespacedName := types.NamespacedName{
40-
Name: resourceName,
41-
Namespace: "default", // TODO(user):Modify as needed
42-
}
43-
iprange := &netboxdevv1.IpRange{}
39+
// typeNamespacedName := types.NamespacedName{
40+
// Name: resourceName,
41+
// Namespace: "default", // TODO(user):Modify as needed
42+
// }
43+
// iprange := &netboxdevv1.IpRange{}
4444

45-
BeforeEach(func() {
46-
By("creating the custom resource for the Kind IpRange")
47-
err := k8sClient.Get(ctx, typeNamespacedName, iprange)
48-
if err != nil && errors.IsNotFound(err) {
49-
resource := &netboxdevv1.IpRange{
50-
ObjectMeta: metav1.ObjectMeta{
51-
Name: resourceName,
52-
Namespace: "default",
53-
},
54-
// TODO(user): Specify other spec details if needed.
55-
}
56-
Expect(k8sClient.Create(ctx, resource)).To(Succeed())
57-
}
58-
})
45+
// BeforeEach(func() {
46+
// By("creating the custom resource for the Kind IpRange")
47+
// err := k8sClient.Get(ctx, typeNamespacedName, iprange)
48+
// if err != nil && errors.IsNotFound(err) {
49+
// resource := &netboxdevv1.IpRange{
50+
// ObjectMeta: metav1.ObjectMeta{
51+
// Name: resourceName,
52+
// Namespace: "default",
53+
// },
54+
// // TODO(user): Specify other spec details if needed.
55+
// }
56+
// Expect(k8sClient.Create(ctx, resource)).To(Succeed())
57+
// }
58+
// })
5959

60-
AfterEach(func() {
61-
// TODO(user): Cleanup logic after each test, like removing the resource instance.
62-
resource := &netboxdevv1.IpRange{}
63-
err := k8sClient.Get(ctx, typeNamespacedName, resource)
64-
Expect(err).NotTo(HaveOccurred())
60+
// AfterEach(func() {
61+
// // TODO(user): Cleanup logic after each test, like removing the resource instance.
62+
// resource := &netboxdevv1.IpRange{}
63+
// err := k8sClient.Get(ctx, typeNamespacedName, resource)
64+
// Expect(err).NotTo(HaveOccurred())
6565

66-
By("Cleanup the specific resource instance IpRange")
67-
Expect(k8sClient.Delete(ctx, resource)).To(Succeed())
68-
})
69-
It("should successfully reconcile the resource", func() {
70-
By("Reconciling the created resource")
71-
controllerReconciler := &IpRangeReconciler{
72-
Client: k8sClient,
73-
Scheme: k8sClient.Scheme(),
74-
}
66+
// By("Cleanup the specific resource instance IpRange")
67+
// Expect(k8sClient.Delete(ctx, resource)).To(Succeed())
68+
// })
69+
// It("should successfully reconcile the resource", func() {
70+
// By("Reconciling the created resource")
71+
// controllerReconciler := &IpRangeReconciler{
72+
// Client: k8sClient,
73+
// Scheme: k8sClient.Scheme(),
74+
// }
7575

76-
_, err := controllerReconciler.Reconcile(ctx, reconcile.Request{
77-
NamespacedName: typeNamespacedName,
78-
})
79-
Expect(err).NotTo(HaveOccurred())
80-
// TODO(user): Add more specific assertions depending on your controller's reconciliation logic.
81-
// Example: If you expect a certain status condition after reconciliation, verify it here.
82-
})
83-
})
84-
})
76+
// _, err := controllerReconciler.Reconcile(ctx, reconcile.Request{
77+
// NamespacedName: typeNamespacedName,
78+
// })
79+
// Expect(err).NotTo(HaveOccurred())
80+
// // TODO(user): Add more specific assertions depending on your controller's reconciliation logic.
81+
// // Example: If you expect a certain status condition after reconciliation, verify it here.
82+
// })
83+
// })
84+
// })

0 commit comments

Comments
 (0)