@@ -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
6669func (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
131151func (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
168224func (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
263349func (r * SRIOVReconciler ) deleteOVSNetworks (ctx context.Context ) error {
264350 p := & unstructured.Unstructured {}
0 commit comments