Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 22 additions & 7 deletions internal/provisioning/hostagent/networkmanager/network_manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,9 @@ type Interface interface {
Start() error
// GetDevice returns the PCI device by serial number
GetDevice(serialNumber string) (hostutil.Device, bool)
// AddNetworkRequest adds a network request for a DPU
AddNetworkRequest(dpu *provisioningv1.DPU) error
// AddNetworkRequest adds a network request for a DPU.
// If vfCount is non-nil it overrides the value derived from the DPUFlavor.
AddNetworkRequest(dpu *provisioningv1.DPU, vfCount *int) error
}

type NetworkManager struct {
Expand Down Expand Up @@ -247,7 +248,7 @@ func (nm *NetworkManager) processNetworkRequest(nr NetworkRequest) error {
return nil
}

func (nm *NetworkManager) AddNetworkRequest(dpu *provisioningv1.DPU) error {
func (nm *NetworkManager) AddNetworkRequest(dpu *provisioningv1.DPU, vfCount *int) error {
nm.Lock()
defer nm.Unlock()
if !nm.initialized {
Expand All @@ -256,7 +257,15 @@ func (nm *NetworkManager) AddNetworkRequest(dpu *provisioningv1.DPU) error {
return fmt.Errorf("DPU is nil")
}

if _, ok := nm.reqs[string(dpu.UID)]; ok {
if existing, ok := nm.reqs[string(dpu.UID)]; ok {
if vfCount != nil && *vfCount != 0 && existing.NumOfVFs != *vfCount {
existing.NumOfVFs = *vfCount
if err := writeNetworkRequestFile(&existing); err != nil {
return fmt.Errorf("failed to update network request file: %w", err)
}
nm.reqs[existing.UID] = existing
klog.Infof("Updated VF count to %d for DPU %s/%s", *vfCount, existing.DPUNamespace, existing.DpuName)
}
return nil
}

Expand All @@ -272,9 +281,15 @@ func (nm *NetworkManager) AddNetworkRequest(dpu *provisioningv1.DPU) error {
}
nr.PCIAddress = dev.Address

numOfVFs, err := nm.getNumOfVFs(dpu)
if err != nil {
return fmt.Errorf("failed to get number of VFs: %w", err)
var numOfVFs int
if vfCount != nil && *vfCount != 0 {
numOfVFs = *vfCount
} else {
var err error
numOfVFs, err = nm.getNumOfVFs(dpu)
if err != nil {
return fmt.Errorf("failed to get number of VFs: %w", err)
}
}
nr.NumOfVFs = numOfVFs

Expand Down
6 changes: 3 additions & 3 deletions internal/provisioning/hostagent/phase/network/hostnetwork.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,18 +31,18 @@ const (
)

type Handler struct {
AddNetworkRequest func(dpu *provisioningv1.DPU) error
AddNetworkRequest func(dpu *provisioningv1.DPU, vfCount *int) error
}

func NewHandler(addNetworkRequest func(dpu *provisioningv1.DPU) error) *Handler {
func NewHandler(addNetworkRequest func(dpu *provisioningv1.DPU, vfCount *int) error) *Handler {
return &Handler{
AddNetworkRequest: addNetworkRequest,
}
}

func (h *Handler) Handle(ctx context.Context, dpu *provisioningv1.DPU) (provisioningv1.DPUStatus, ctrl.Result, error) {
log := log.FromContext(ctx)
if err := h.AddNetworkRequest(dpu); err != nil {
if err := h.AddNetworkRequest(dpu, nil); err != nil {
log.Error(err, "Failed to add network request")
hostutil.NewCondition(condition).Failure(err, "FailedToSetupHostNetwork").Set(&dpu.Status.Conditions)
return dpu.Status, ctrl.Result{}, err
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ const (
// NetworkConfigurator is an interface for triggering host network configuration.
// It is satisfied by networkmanager.NetworkManager.
type NetworkConfigurator interface {
AddNetworkRequest(dpu *provisioningv1.DPU) error
AddNetworkRequest(dpu *provisioningv1.DPU, vfCount *int) error
}

type InstallationService struct {
Expand Down Expand Up @@ -329,7 +329,7 @@ func (s *InstallationService) ConfigureHostVFs(req *restful.Request, resp *restf
return
}

if err := s.networkManager.AddNetworkRequest(dpu); err != nil {
if err := s.networkManager.AddNetworkRequest(dpu, &request.VFCount); err != nil {
klog.Errorf("failed to add network request for DPU %s/%s: %v", request.DPUNamespace, request.DPUName, err)
_ = resp.WriteError(http.StatusInternalServerError, err)
return
Expand Down
1 change: 1 addition & 0 deletions internal/provisioning/hostagent/service/types/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,5 @@ type UpdateStatusRequest struct {
type ConfigureHostVFsRequest struct {
DPUName string `json:"dpuName"`
DPUNamespace string `json:"dpuNamespace"`
VFCount int `json:"vfCount"`
}