Skip to content

Commit 0d22757

Browse files
committed
add support for IPv6
1 parent 0508ece commit 0d22757

18 files changed

+506
-109
lines changed

api/v1/ipaddress_types.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ type IpAddressSpec struct {
2828
// INSERT ADDITIONAL SPEC FIELDS - desired state of cluster
2929
// Important: Run "make" to regenerate code after modifying this file
3030

31-
//+kubebuilder:validation:Pattern=`^((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\/([1-9]|[12][0-9]|3[0-2])$`
31+
//+kubebuilder:validation:Format=cidr
3232
//+kubebuilder:validation:XValidation:rule="self == oldSelf",message="Field 'ipAddress' is immutable"
3333
//+kubebuilder:validation:Required
3434
IpAddress string `json:"ipAddress"`

api/v1/ipaddressclaim_types.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ type IpAddressClaimSpec struct {
2929
// Important: Run "make" to regenerate code after modifying this file
3030

3131
//+kubebuilder:validation:Required
32-
//+kubebuilder:validation:Pattern=`^((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\/([1-9]|[12][0-9]|3[0-2])$`
32+
//+kubebuilder:validation:Format=cidr
3333
//+kubebuilder:validation:XValidation:rule="self == oldSelf",message="Field 'parentPrefix' is immutable"
3434
ParentPrefix string `json:"parentPrefix"`
3535

api/v1/prefix_types.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ type PrefixSpec struct {
2929
// Important: Run "make" to regenerate code after modifying this file
3030

3131
//+kubebuilder:validation:Required
32-
//+kubebuilder:validation:Pattern=`^((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\/([1-9]|[12][0-9]|3[0-2])$`
32+
//+kubebuilder:validation:Format=cidr
3333
//+kubebuilder:validation:XValidation:rule="self == oldSelf",message="Field 'prefix' is immutable"
3434
Prefix string `json:"prefix"`
3535

api/v1/prefixclaim_types.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,12 @@ type PrefixClaimSpec struct {
2929
// Important: Run "make" to regenerate code after modifying this file
3030

3131
//+kubebuilder:validation:Required
32-
//+kubebuilder:validation:Pattern=`^((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\/([1-9]|[12][0-9]|3[0-2])$`
32+
//+kubebuilder:validation:Format=cidr
3333
//+kubebuilder:validation:XValidation:rule="self == oldSelf",message="Field 'parentPrefix' is immutable"
3434
ParentPrefix string `json:"parentPrefix"`
3535

3636
//+kubebuilder:validation:Required
37-
//+kubebuilder:validation:Pattern=`^\/([1-9]|[12][0-9]|3[0-2])$`
37+
//+kubebuilder:validation:Pattern=`^\/[0-9]|[1-9][0-9]|11[0-9]|12[0-8]$`
3838
//+kubebuilder:validation:XValidation:rule="self == oldSelf",message="Field 'prefixLength' is immutable"
3939
PrefixLength string `json:"prefixLength"`
4040

config/crd/bases/netbox.dev_ipaddressclaims.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ spec:
6060
description:
6161
type: string
6262
parentPrefix:
63-
pattern: ^((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\/([1-9]|[12][0-9]|3[0-2])$
63+
format: cidr
6464
type: string
6565
x-kubernetes-validations:
6666
- message: Field 'parentPrefix' is immutable

config/crd/bases/netbox.dev_ipaddresses.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ spec:
6363
description:
6464
type: string
6565
ipAddress:
66-
pattern: ^((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\/([1-9]|[12][0-9]|3[0-2])$
66+
format: cidr
6767
type: string
6868
x-kubernetes-validations:
6969
- message: Field 'ipAddress' is immutable

config/crd/bases/netbox.dev_prefixclaims.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,13 +60,13 @@ spec:
6060
description:
6161
type: string
6262
parentPrefix:
63-
pattern: ^((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\/([1-9]|[12][0-9]|3[0-2])$
63+
format: cidr
6464
type: string
6565
x-kubernetes-validations:
6666
- message: Field 'parentPrefix' is immutable
6767
rule: self == oldSelf
6868
prefixLength:
69-
pattern: ^\/([1-9]|[12][0-9]|3[0-2])$
69+
pattern: ^\/[0-9]|[1-9][0-9]|11[0-9]|12[0-8]$
7070
type: string
7171
x-kubernetes-validations:
7272
- message: Field 'prefixLength' is immutable

config/crd/bases/netbox.dev_prefixes.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ spec:
6363
description:
6464
type: string
6565
prefix:
66-
pattern: ^((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\/([1-9]|[12][0-9]|3[0-2])$
66+
format: cidr
6767
type: string
6868
x-kubernetes-validations:
6969
- message: Field 'prefix' is immutable

internal/controller/ipaddress_controller.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,10 @@ func (r *IpAddressReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
118118
}
119119

120120
// get name of parent prefix
121-
parentPrefixName := strings.Replace(ipAddressClaim.Spec.ParentPrefix, "/", "-", -1)
122-
123-
leaseLockerNSN := types.NamespacedName{Name: parentPrefixName, Namespace: r.OperatorNamespace}
121+
leaseLockerNSN := types.NamespacedName{
122+
Name: convertCIDRToLeaseLockName(ipAddressClaim.Spec.ParentPrefix),
123+
Namespace: r.OperatorNamespace,
124+
}
124125
ll, err = leaselocker.NewLeaseLocker(r.RestConfig, leaseLockerNSN, req.NamespacedName.String())
125126
if err != nil {
126127
return ctrl.Result{}, err
@@ -132,13 +133,14 @@ func (r *IpAddressReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
132133
// create lock
133134
locked := ll.TryLock(lockCtx)
134135
if !locked {
135-
logger.Info(fmt.Sprintf("failed to lock parent prefix %s", parentPrefixName))
136-
r.Recorder.Eventf(o, corev1.EventTypeWarning, "FailedToLockParentPrefix", "failed to lock parent prefix %s", parentPrefixName)
136+
logger.Info(fmt.Sprintf("failed to lock parent prefix %s", ipAddressClaim.Spec.ParentPrefix))
137+
r.Recorder.Eventf(o, corev1.EventTypeWarning, "FailedToLockParentPrefix", "failed to lock parent prefix %s",
138+
ipAddressClaim.Spec.ParentPrefix)
137139
return ctrl.Result{
138140
RequeueAfter: 2 * time.Second,
139141
}, nil
140142
}
141-
debugLogger.Info(fmt.Sprintf("sucessfully locked parent prefix %s", parentPrefixName))
143+
debugLogger.Info(fmt.Sprintf("successfully locked parent prefix %s", ipAddressClaim.Spec.ParentPrefix))
142144
}
143145

144146
// 2. reserve or update ip address in netbox

internal/controller/ipaddressclaim_controller.go

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -95,9 +95,10 @@ func (r *IpAddressClaimReconciler) Reconcile(ctx context.Context, req ctrl.Reque
9595
debugLogger.Info("ipaddress object matching ipaddress claim was not found, creating new ipaddress object")
9696

9797
// 2. check if lease for parent prefix is available
98-
parentPrefixName := strings.ReplaceAll(o.Spec.ParentPrefix, "/", "-")
99-
100-
leaseLockerNSN := types.NamespacedName{Name: parentPrefixName, Namespace: r.OperatorNamespace}
98+
leaseLockerNSN := types.NamespacedName{
99+
Name: convertCIDRToLeaseLockName(o.Spec.ParentPrefix),
100+
Namespace: r.OperatorNamespace,
101+
}
101102
ll, err := leaselocker.NewLeaseLocker(r.RestConfig, leaseLockerNSN, req.Namespace+"/"+ipAddressName)
102103
if err != nil {
103104
return ctrl.Result{}, err
@@ -110,21 +111,24 @@ func (r *IpAddressClaimReconciler) Reconcile(ctx context.Context, req ctrl.Reque
110111
locked := ll.TryLock(lockCtx)
111112
if !locked {
112113
// lock for parent prefix was not available, rescheduling
113-
logger.Info(fmt.Sprintf("failed to lock parent prefix %s", parentPrefixName))
114-
r.Recorder.Eventf(o, corev1.EventTypeWarning, "FailedToLockParentPrefix", "failed to lock parent prefix %s", parentPrefixName)
114+
logger.Info(fmt.Sprintf("failed to lock parent prefix %s", o.Spec.ParentPrefix))
115+
r.Recorder.Eventf(o, corev1.EventTypeWarning, "FailedToLockParentPrefix", "failed to lock parent prefix %s",
116+
o.Spec.ParentPrefix)
115117
return ctrl.Result{
116118
RequeueAfter: 2 * time.Second,
117119
}, nil
118120
}
119-
debugLogger.Info(fmt.Sprintf("successfully locked parent prefix %s", parentPrefixName))
121+
debugLogger.Info(fmt.Sprintf("successfully locked parent prefix %s", o.Spec.ParentPrefix))
120122

121123
// 4. try to reclaim ip address
122124
h := generateIpAddressRestorationHash(o)
123125
ipAddressModel, err := r.NetboxClient.RestoreExistingIpByHash(config.GetOperatorConfig().NetboxRestorationHashFieldName, h)
124126
if err != nil {
127+
if setConditionErr := r.SetConditionAndCreateEvent(ctx, o, netboxv1.ConditionIpAssignedFalse, corev1.EventTypeWarning, err.Error()); setConditionErr != nil {
128+
return ctrl.Result{}, fmt.Errorf("error updating status: %w, looking up ip by hash failed: %w", setConditionErr, err)
129+
}
125130
return ctrl.Result{}, err
126131
}
127-
// TODO: set condition for each error
128132

129133
if ipAddressModel == nil {
130134
// ip address cannot be restored from netbox
@@ -137,6 +141,9 @@ func (r *IpAddressClaimReconciler) Reconcile(ctx context.Context, req ctrl.Reque
137141
},
138142
})
139143
if err != nil {
144+
if setConditionErr := r.SetConditionAndCreateEvent(ctx, o, netboxv1.ConditionIpAssignedFalse, corev1.EventTypeWarning, err.Error()); setConditionErr != nil {
145+
return ctrl.Result{}, fmt.Errorf("error updating status: %w, when assignment of ip address failed: %w", setConditionErr, err)
146+
}
140147
return ctrl.Result{}, err
141148
}
142149
debugLogger.Info(fmt.Sprintf("ip address is not reserved in netbox, assignined new ip address: %s", ipAddressModel.IpAddress))

0 commit comments

Comments
 (0)