Skip to content

Commit 0479838

Browse files
e0nerollandf
authored andcommitted
feat: Configure other_config for OVS
Signed-off-by: Ivan Kolodiazhnyi <[email protected]>
1 parent 48724b1 commit 0479838

File tree

4 files changed

+91
-2
lines changed

4 files changed

+91
-2
lines changed

config/rbac/role.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ rules:
6464
resources:
6565
- ovsnetworks
6666
- sriovnetworknodepolicies
67+
- sriovnetworkpoolconfigs
6768
verbs:
6869
- create
6970
- delete

go.mod

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,3 +141,5 @@ require (
141141
sigs.k8s.io/structured-merge-diff/v4 v4.5.0 // indirect
142142
sigs.k8s.io/yaml v1.4.0 // indirect
143143
)
144+
145+
replace github.com/k8snetworkplumbingwg/sriov-network-operator v1.5.1-0.20250406123337-cd029e38821c => github.com/Mellanox/sriov-network-operator v0.0.0-20250416070735-fa04774c983d

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ github.com/Masterminds/sprig/v3 v3.2.2 h1:17jRggJu518dr3QaafizSXOjKYp94wKfABxUmy
99
github.com/Masterminds/sprig/v3 v3.2.2/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk=
1010
github.com/Mellanox/nvidia-k8s-ipam v0.3.7 h1:B2XXKlzidvBdYL34sjkEtDX5trfvTXm9Q9kpEQh5MVA=
1111
github.com/Mellanox/nvidia-k8s-ipam v0.3.7/go.mod h1:2qYlKQ8uoVYxyuZS4p5QCuZCGbLctyVvVNhDpUqUbi8=
12+
github.com/Mellanox/sriov-network-operator v0.0.0-20250416070735-fa04774c983d h1:EFxIoLBoNxassRiBWVCtAnLVOwKNUnnJf5ZM3KtKH4c=
13+
github.com/Mellanox/sriov-network-operator v0.0.0-20250416070735-fa04774c983d/go.mod h1:pGnFNMA5HJS8KCmRfF+lHRzuaZB1ISVpsi2x8ATn02M=
1214
github.com/ajeddeloh/go-json v0.0.0-20170920214419-6a2fe990e083/go.mod h1:otnto4/Icqn88WCcM4bhIJNSgsh9VLBuspyyCfvof9c=
1315
github.com/ajeddeloh/go-json v0.0.0-20200220154158-5ae607161559 h1:4SPQljF/GJ8Q+QlCWMWxRBepub4DresnOm4eI2ebFGc=
1416
github.com/ajeddeloh/go-json v0.0.0-20200220154158-5ae607161559/go.mod h1:otnto4/Icqn88WCcM4bhIJNSgsh9VLBuspyyCfvof9c=
@@ -146,8 +148,6 @@ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHm
146148
github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
147149
github.com/k8snetworkplumbingwg/network-attachment-definition-client v1.7.6 h1:lhSaboKtal0XF2yqSw2BqNB1vUL4+a4BFe39I9G/yiM=
148150
github.com/k8snetworkplumbingwg/network-attachment-definition-client v1.7.6/go.mod h1:CM7HAH5PNuIsqjMN0fGc1ydM74Uj+0VZFhob620nklw=
149-
github.com/k8snetworkplumbingwg/sriov-network-operator v1.5.1-0.20250406123337-cd029e38821c h1:+2B8FqUOX6Y2CSi12LXQ6FPq0WQ0KOhQX0wOWS01cTs=
150-
github.com/k8snetworkplumbingwg/sriov-network-operator v1.5.1-0.20250406123337-cd029e38821c/go.mod h1:pGnFNMA5HJS8KCmRfF+lHRzuaZB1ISVpsi2x8ATn02M=
151151
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
152152
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
153153
github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc=

internal/controller/sriov_controller.go

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ const (
4646
ovsDataPathType = "netdev"
4747
ovsNetworkInterfaceType = "dpdk"
4848
sriovNodePolicyType = "SriovNetworkNodePolicy"
49+
sriovPoolConfigType = "SriovNetworkPoolConfig"
50+
sriovPoolConfigName = "spectrum-x-node-pool-config"
4951
sriovNodePolicyNodeSelector = "node-role.kubernetes.io/worker"
5052
spectrumXSRIOVFinalizer = "spectrumx.nvidia.com/sriovnetwork-finalizer"
5153
)
@@ -62,6 +64,7 @@ type SRIOVReconciler struct {
6264
//+kubebuilder:rbac:groups="",resources=configmaps/finalizers,verbs=update
6365
//+kubebuilder:rbac:groups=sriovnetwork.openshift.io,resources=ovsnetworks,verbs=create;get;list;patch;delete;deletecollection
6466
//+kubebuilder:rbac:groups=sriovnetwork.openshift.io,resources=sriovnetworknodepolicies,verbs=create;get;list;patch;delete;deletecollection
67+
//+kubebuilder:rbac:groups=sriovnetwork.openshift.io,resources=sriovnetworkpoolconfigs,verbs=create;get;list;patch;delete;deletecollection
6568

6669
func (r *SRIOVReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
6770
logr := log.FromContext(ctx)
@@ -99,6 +102,12 @@ func (r *SRIOVReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl
99102
return ctrl.Result{}, nil
100103
}
101104

105+
err = r.reconcileSRIOVNetworkPoolConfig(ctx)
106+
if err != nil {
107+
logr.Info("Failed to reconcile SriovNetworkPoolConfig")
108+
return ctrl.Result{}, err
109+
}
110+
102111
err = r.reconcileSRIOVNetworkNodePolicy(ctx, spectrumXConfig)
103112
if err != nil {
104113
logr.Info("Failed to reconcile SRIOVNetworkNodePolicy")
@@ -127,6 +136,17 @@ func (r *SRIOVReconciler) reconcileOVSNetwork(ctx context.Context, cfg *config.C
127136
return nil
128137
}
129138

139+
// reconcileSRIOVNetworkNodePolicy generates SriovNetworkPoolConfig
140+
func (r *SRIOVReconciler) reconcileSRIOVNetworkPoolConfig(ctx context.Context) error {
141+
logr := log.FromContext(ctx)
142+
poolConfig := r.generateSriovNetworkPoolConfig()
143+
logr.Info("Creating SriovNetworkPoolConfig", "name", poolConfig.Spec)
144+
if err := r.Client.Patch(ctx, poolConfig, client.Apply, client.ForceOwnership, client.FieldOwner(spectrumXSRIOVControllerName)); err != nil {
145+
return fmt.Errorf("error while patching %s %s: %w", poolConfig.GetObjectKind().GroupVersionKind().String(), client.ObjectKeyFromObject(poolConfig), err)
146+
}
147+
return nil
148+
}
149+
130150
// reconcileSRIOVNetworkNodePolicy generates SRIOVNetworkNodePolicy according to defined Rails
131151
func (r *SRIOVReconciler) reconcileSRIOVNetworkNodePolicy(ctx context.Context, cfg *config.Config) error {
132152
logr := log.FromContext(ctx)
@@ -164,6 +184,42 @@ func (r *SRIOVReconciler) generateOVSNetwork(rail *config.Rail, mtu uint) *sriov
164184
return network
165185
}
166186

187+
// generateSriovNetworkPoolConfig generates a SriovNetworkPoolConfig object
188+
func (r *SRIOVReconciler) generateSriovNetworkPoolConfig() *sriovnetworkv1.SriovNetworkPoolConfig {
189+
nodeSelector := metav1.LabelSelector{
190+
MatchLabels: map[string]string{
191+
sriovNodePolicyNodeSelector: "",
192+
},
193+
}
194+
195+
ovsHardwareOffloadConfig := sriovnetworkv1.OvsHardwareOffloadConfig{
196+
OvsConfig: map[string]string{
197+
"doca-init": "true",
198+
"hw-offload": "true",
199+
"doca-eswitch-max": "8",
200+
"hw-offload-ct-size": "0",
201+
},
202+
}
203+
204+
nodePoolConfig := &sriovnetworkv1.SriovNetworkPoolConfig{
205+
ObjectMeta: metav1.ObjectMeta{
206+
Name: sriovPoolConfigName,
207+
Namespace: r.SriovObjNamespace,
208+
Labels: map[string]string{
209+
spectrumXSRIOVControllerName: "",
210+
},
211+
},
212+
Spec: sriovnetworkv1.SriovNetworkPoolConfigSpec{
213+
NodeSelector: &nodeSelector,
214+
OvsHardwareOffloadConfig: ovsHardwareOffloadConfig,
215+
},
216+
}
217+
218+
nodePoolConfig.ObjectMeta.ManagedFields = nil
219+
nodePoolConfig.SetGroupVersionKind(sriovnetworkv1.GroupVersion.WithKind(sriovPoolConfigType))
220+
return nodePoolConfig
221+
}
222+
167223
// generateSRIOVNetworkNodePolicy generates a SRIOVNetworkNodePolicy object for the given Rail
168224
func (r *SRIOVReconciler) generateSRIOVNetworkNodePolicy(railName, deviceName string, mtu uint) *sriovnetworkv1.SriovNetworkNodePolicy {
169225
nicSelector := &sriovnetworkv1.SriovNetworkNicSelector{
@@ -223,6 +279,9 @@ func (r *SRIOVReconciler) reconcileDelete(ctx context.Context, cm *corev1.Config
223279
if err := r.deleteSRIOVNetworkNodePolicies(ctx); err != nil {
224280
return ctrl.Result{}, err
225281
}
282+
if err := r.deleteSRIOVNetworkPoolConfig(ctx); err != nil {
283+
return ctrl.Result{}, err
284+
}
226285
logr.Info("Removing finalizer")
227286
controllerutil.RemoveFinalizer(cm, spectrumXSRIOVFinalizer)
228287
cm.ObjectMeta.ManagedFields = nil
@@ -259,6 +318,33 @@ func (r *SRIOVReconciler) deleteSRIOVNetworkNodePolicies(ctx context.Context) er
259318
})
260319
}
261320

321+
// deleteSRIOVNetworkPoolConfig the SriovNetworkPoolConfig created by controller
322+
func (r *SRIOVReconciler) deleteSRIOVNetworkPoolConfig(ctx context.Context) error {
323+
p := &unstructured.Unstructured{}
324+
p.SetGroupVersionKind(sriovnetworkv1.GroupVersion.WithKind(sriovPoolConfigType))
325+
if err := r.Client.DeleteAllOf(ctx, p, client.InNamespace(r.SriovObjNamespace), client.MatchingLabels{
326+
spectrumXSRIOVControllerName: "",
327+
}); err != nil {
328+
return fmt.Errorf("error while removing all %s: %w", p.GetObjectKind().GroupVersionKind().String(), err)
329+
}
330+
// Wait for all instances to be deleted
331+
timeout := 30 * time.Second
332+
interval := 1 * time.Second
333+
return wait.PollUntilContextTimeout(ctx, interval, timeout, true, func(ctx context.Context) (bool, error) {
334+
list := &unstructured.UnstructuredList{}
335+
list.SetGroupVersionKind(sriovnetworkv1.GroupVersion.WithKind(sriovPoolConfigType))
336+
337+
if err := r.Client.List(ctx, list, client.InNamespace(r.SriovObjNamespace), client.MatchingLabels{
338+
spectrumXSRIOVControllerName: "",
339+
}); err != nil {
340+
return false, fmt.Errorf("error while listing %s: %w", list.GetObjectKind().GroupVersionKind().String(), err)
341+
}
342+
343+
// If no resources remain, deletion is complete
344+
return len(list.Items) == 0, nil
345+
})
346+
}
347+
262348
// deleteOVSNetworks deletes all the OVS Networks created by controller
263349
func (r *SRIOVReconciler) deleteOVSNetworks(ctx context.Context) error {
264350
p := &unstructured.Unstructured{}

0 commit comments

Comments
 (0)