Skip to content

Commit 5a96faa

Browse files
committed
improvements based on review
1 parent a13049e commit 5a96faa

File tree

14 files changed

+234
-198
lines changed

14 files changed

+234
-198
lines changed

api/v1/iprange_types.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ type IpRangeStatus struct {
6767
//+kubebuilder:printcolumn:name="ID",type=string,JSONPath=`.status.id`
6868
//+kubebuilder:printcolumn:name="URL",type=string,JSONPath=`.status.url`
6969
//+kubebuilder:printcolumn:name="Age",type=date,JSONPath=`.metadata.creationTimestamp`
70-
// +kubebuilder:resource:shortName=ir
70+
// +kubebuilder:resource:shortName=ipr
7171

7272
// IpRange is the Schema for the ipranges API
7373
type IpRange struct {
@@ -94,20 +94,20 @@ func init() {
9494
var ConditionIpRangeReadyTrue = metav1.Condition{
9595
Type: "Ready",
9696
Status: "True",
97-
Reason: "IpRangeReservedInNetbox",
98-
Message: "Ip Range was reserved/updated in NetBox",
97+
Reason: "IPRangeReservedInNetbox",
98+
Message: "IP Range was reserved/updated in NetBox",
9999
}
100100

101101
var ConditionIpRangeReadyFalse = metav1.Condition{
102102
Type: "Ready",
103103
Status: "False",
104-
Reason: "FailedToReserveIpRangeInNetbox",
105-
Message: "Failed to reserve Ip Range in NetBox",
104+
Reason: "FailedToReserveIPRangeInNetbox",
105+
Message: "Failed to reserve IP Range in NetBox",
106106
}
107107

108108
var ConditionIpRangeReadyFalseDeletionFailed = metav1.Condition{
109109
Type: "Ready",
110110
Status: "False",
111-
Reason: "FailedToDeleteIpRangeInNetbox",
112-
Message: "Failed to delete Ip Range in NetBox",
111+
Reason: "FailedToDeleteIPRangeInNetbox",
112+
Message: "Failed to delete IP Range in NetBox",
113113
}

api/v1/iprangeclaim_types.go

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,10 @@ type IpRangeClaimStatus struct {
7474
//+kubebuilder:subresource:status
7575
//+kubebuilder:storageversion
7676
//+kubebuilder:printcolumn:name="IpRange",type=string,JSONPath=`.status.ipRange`
77-
//+kubebuilder:printcolumn:name="IpRangeAssigned",type=string,JSONPath=`.status.conditions[?(@.type=="IpRangeAssigned")].status`
77+
//+kubebuilder:printcolumn:name="IpRangeAssigned",type=string,JSONPath=`.status.conditions[?(@.type=="IPRangeAssigned")].status`
7878
//+kubebuilder:printcolumn:name="Ready",type=string,JSONPath=`.status.conditions[?(@.type=="Ready")].status`
7979
//+kubebuilder:printcolumn:name="Age",type=date,JSONPath=`.metadata.creationTimestamp`
80-
// +kubebuilder:resource:shortName=irc
80+
// +kubebuilder:resource:shortName=iprc
8181

8282
// IpRangeClaim is the Schema for the iprangeclaims API
8383
type IpRangeClaim struct {
@@ -104,41 +104,41 @@ func init() {
104104
var ConditionIpRangeClaimReadyTrue = metav1.Condition{
105105
Type: "Ready",
106106
Status: "True",
107-
Reason: "IpRangeResourceReady",
108-
Message: "Ip Range Resource is ready",
107+
Reason: "IPRangeResourceReady",
108+
Message: "IP Range Resource is ready",
109109
}
110110

111111
var ConditionIpRangeClaimReadyFalse = metav1.Condition{
112112
Type: "Ready",
113113
Status: "False",
114-
Reason: "IpRangeResourceNotReady",
115-
Message: "Ip Range Resource is not ready",
114+
Reason: "IPRangeResourceNotReady",
115+
Message: "IP Range Resource is not ready",
116116
}
117117

118118
var ConditionIpRangeClaimReadyFalseStatusGen = metav1.Condition{
119119
Type: "Ready",
120120
Status: "False",
121-
Reason: "IpRangeClaimStatusGenerationFailed",
122-
Message: "Failed to generate Ip Range Status",
121+
Reason: "IPRangeClaimStatusGenerationFailed",
122+
Message: "Failed to generate IP Range Status",
123123
}
124124

125125
var ConditionIpRangeAssignedTrue = metav1.Condition{
126-
Type: "IpRangeAssigned",
126+
Type: "IPRangeAssigned",
127127
Status: "True",
128-
Reason: "IpRangeCRCreated",
129-
Message: "New Ip Range fetched from NetBox and IpRange CR was created",
128+
Reason: "IPRangeCRCreated",
129+
Message: "New IP Range fetched from NetBox and IpRange CR was created",
130130
}
131131

132132
var ConditionIpRangeAssignedFalse = metav1.Condition{
133-
Type: "IpRangeAssigned",
133+
Type: "IPRangeAssigned",
134134
Status: "False",
135-
Reason: "IpRangeCRNotCreated",
136-
Message: "Failed to fetch new Ip Range from NetBox",
135+
Reason: "IPRangeCRNotCreated",
136+
Message: "Failed to fetch new IP Range from NetBox",
137137
}
138138

139139
var ConditionIpRangeAssignedFalseSizeMissmatch = metav1.Condition{
140-
Type: "IpRangeAssigned",
140+
Type: "IPRangeAssigned",
141141
Status: "False",
142-
Reason: "IpRangeCRNotCreated",
143-
Message: "Assigned/Restored ip range has less available ip addresses than requested",
142+
Reason: "IPRangeCRNotCreated",
143+
Message: "Assigned/Restored IP range has less available IP addresses than requested",
144144
}

config/crd/bases/netbox.dev_iprangeclaims.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,15 @@ spec:
1212
listKind: IpRangeClaimList
1313
plural: iprangeclaims
1414
shortNames:
15-
- irc
15+
- iprc
1616
singular: iprangeclaim
1717
scope: Namespaced
1818
versions:
1919
- additionalPrinterColumns:
2020
- jsonPath: .status.ipRange
2121
name: IpRange
2222
type: string
23-
- jsonPath: .status.conditions[?(@.type=="IpRangeAssigned")].status
23+
- jsonPath: .status.conditions[?(@.type=="IPRangeAssigned")].status
2424
name: IpRangeAssigned
2525
type: string
2626
- jsonPath: .status.conditions[?(@.type=="Ready")].status

config/crd/bases/netbox.dev_ipranges.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ spec:
1212
listKind: IpRangeList
1313
plural: ipranges
1414
shortNames:
15-
- ir
15+
- ipr
1616
singular: iprange
1717
scope: Namespaced
1818
versions:

internal/controller/ipaddress_controller.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ import (
4545
)
4646

4747
const IpAddressFinalizerName = "ipaddress.netbox.dev/finalizer"
48-
const LastIpAddressMetadataAnnotationName = "ipaddress.netbox.dev/last-ip-address-metadata"
48+
const LastIpAddressManagedCustomFieldsAnnotationName = "ipaddress.netbox.dev/managed-custom-fields"
4949

5050
// IpAddressReconciler reconciles a IpAddress object
5151
type IpAddressReconciler struct {
@@ -163,7 +163,7 @@ func (r *IpAddressReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
163163
return ctrl.Result{}, err
164164
}
165165

166-
ipAddressModel, err := generateNetboxIpAddressModelFromIpAddressSpec(&o.Spec, req, annotations[LastIpAddressMetadataAnnotationName])
166+
ipAddressModel, err := generateNetboxIpAddressModelFromIpAddressSpec(&o.Spec, req, annotations[LastIpAddressManagedCustomFieldsAnnotationName])
167167
if err != nil {
168168
return ctrl.Result{}, err
169169
}
@@ -189,7 +189,11 @@ func (r *IpAddressReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
189189
return ctrl.Result{}, err
190190
}
191191

192-
annotations, err = updateLastMetadataAnnotation(annotations, o.Spec.CustomFields)
192+
if annotations == nil {
193+
annotations = make(map[string]string, 1)
194+
}
195+
196+
annotations[LastIpAddressManagedCustomFieldsAnnotationName], err = generateLastMetadataAnnotation(o.Spec.CustomFields)
193197
if err != nil {
194198
logger.Error(err, "failed to update last metadata annotation")
195199
return ctrl.Result{Requeue: true}, nil

internal/controller/iprange_controller.go

Lines changed: 44 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -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

4544
const 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
4948
type 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

Comments
 (0)