Skip to content

Commit 87bdd6c

Browse files
committed
improvements based on review
1 parent a13049e commit 87bdd6c

File tree

14 files changed

+235
-196
lines changed

14 files changed

+235
-196
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: 45 additions & 59 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,41 +74,26 @@ 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-
}
90-
91-
return ctrl.Result{Requeue: true}, nil
92-
}
80+
err = r.logErrorSetConditionAndCreateEvent(ctx, o, netboxv1.ConditionIpRangeReadyFalseDeletionFailed,
81+
corev1.EventTypeWarning, "", err)
82+
if err != nil {
83+
return ctrl.Result{}, err
84+
}
9385

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 {
94+
if !o.Spec.PreserveInNetbox {
95+
err = addFinalizer(ctx, r.Client, o, IpRangeFinalizerName)
96+
if err != nil {
11297
return ctrl.Result{}, err
11398
}
11499
}
@@ -119,24 +104,12 @@ func (r *IpRangeReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
119104
var ll *leaselocker.LeaseLocker
120105
if len(or) > 0 && !apismeta.IsStatusConditionTrue(o.Status.Conditions, "Ready") {
121106

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)
107+
leaseLockerNSN, owner, parentPrefix, err := r.getLeaseLockerNSNandOwner(ctx, o)
130108
if err != nil {
131109
return ctrl.Result{}, err
132110
}
133111

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())
112+
ll, err = leaselocker.NewLeaseLocker(r.RestConfig, leaseLockerNSN, owner)
140113
if err != nil {
141114
return ctrl.Result{}, err
142115
}
@@ -147,12 +120,12 @@ func (r *IpRangeReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
147120
// create lock
148121
locked := ll.TryLock(lockCtx)
149122
if !locked {
150-
logger.Info(fmt.Sprintf("failed to lock parent prefix %s", ipRangeClaim.Spec.ParentPrefix))
123+
logger.Info(fmt.Sprintf("failed to lock parent prefix %s", parentPrefix))
151124
r.Recorder.Eventf(o, corev1.EventTypeWarning, "FailedToLockParentPrefix", "failed to lock parent prefix %s",
152-
ipRangeClaim.Spec.ParentPrefix)
125+
parentPrefix)
153126
return ctrl.Result{Requeue: true}, nil
154127
}
155-
logger.V(4).Info(fmt.Sprintf("successfully locked parent prefix %s", ipRangeClaim.Spec.ParentPrefix))
128+
logger.V(4).Info(fmt.Sprintf("successfully locked parent prefix %s", parentPrefix))
156129
}
157130

158131
// 2. reserve or update ip range in netbox
@@ -162,15 +135,15 @@ func (r *IpRangeReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
162135
return ctrl.Result{}, err
163136
}
164137

165-
ipRangeModel, err := r.generateNetboxIpRangeModelFromIpRangeSpec(o, req, annotations[LastIpRangeMetadataAnnotationName])
138+
ipRangeModel, err := r.generateNetboxIpRangeModelFromIpRangeSpec(o, req, annotations[LastIpRangeManagedCustomFieldsAnnotationName])
166139
if err != nil {
167140
return ctrl.Result{}, err
168141
}
169142

170143
netboxIpRangeModel, err := r.NetboxClient.ReserveOrUpdateIpRange(ipRangeModel)
171144
if err != nil {
172145
err := r.logErrorSetConditionAndCreateEvent(ctx, o, netboxv1.ConditionIpRangeReadyFalse,
173-
corev1.EventTypeWarning, fmt.Sprintf("%s-%s", o.Spec.StartAddress, o.Spec.EndAddress), err)
146+
corev1.EventTypeWarning, fmt.Sprintf("%s-%s ", o.Spec.StartAddress, o.Spec.EndAddress), err)
174147
if err != nil {
175148
return ctrl.Result{}, err
176149
}
@@ -189,7 +162,11 @@ func (r *IpRangeReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
189162
return ctrl.Result{}, err
190163
}
191164

192-
annotations, err = updateLastMetadataAnnotation(annotations, o.Spec.CustomFields)
165+
if annotations == nil {
166+
annotations = make(map[string]string, 1)
167+
}
168+
169+
annotations[LastIpRangeManagedCustomFieldsAnnotationName], err = generateLastMetadataAnnotation(o.Spec.CustomFields)
193170
if err != nil {
194171
logger.Error(err, "failed to update last metadata annotation")
195172
return ctrl.Result{Requeue: true}, nil
@@ -287,15 +264,24 @@ func (r *IpRangeReconciler) generateNetboxIpRangeModelFromIpRangeSpec(o *netboxv
287264
}, nil
288265
}
289266

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-
}
267+
func (r *IpRangeReconciler) getLeaseLockerNSNandOwner(ctx context.Context, o *netboxv1.IpRange) (types.NamespacedName, string, string, error) {
268+
269+
orLookupKey := types.NamespacedName{
270+
Name: o.ObjectMeta.OwnerReferences[0].Name,
271+
Namespace: o.Namespace,
272+
}
273+
274+
ipRangeClaim := &netboxv1.IpRangeClaim{}
275+
err := r.Client.Get(ctx, orLookupKey, ipRangeClaim)
276+
if err != nil {
277+
return types.NamespacedName{}, "", "", err
278+
}
279+
280+
// get name of parent prefix
281+
leaseLockerNSN := types.NamespacedName{
282+
Name: convertCIDRToLeaseLockName(ipRangeClaim.Spec.ParentPrefix),
283+
Namespace: r.OperatorNamespace,
298284
}
299285

300-
return nil
286+
return leaseLockerNSN, orLookupKey.String(), ipRangeClaim.Spec.ParentPrefix, nil
301287
}

0 commit comments

Comments
 (0)