From 9e6b8ed53846d61419116252b4ccfe656512bfd9 Mon Sep 17 00:00:00 2001 From: wanyaoqi Date: Fri, 7 Jul 2023 14:32:15 +0800 Subject: [PATCH] fix(region,scheduler): ovs offload support vpc network --- pkg/compute/models/guestnetworks.go | 12 +----- pkg/compute/models/guests.go | 43 ++++++++++++++++--- pkg/compute/models/isolated_devices.go | 5 ++- pkg/hostman/isolated_device/nic.go | 8 ++-- .../algorithm/predicates/network_predicate.go | 2 +- 5 files changed, 48 insertions(+), 22 deletions(-) diff --git a/pkg/compute/models/guestnetworks.go b/pkg/compute/models/guestnetworks.go index e804e5c0ce..325b4fd717 100644 --- a/pkg/compute/models/guestnetworks.go +++ b/pkg/compute/models/guestnetworks.go @@ -402,6 +402,7 @@ func (self *SGuestnetwork) checkOrAllocateIfname(network *SNetwork, preferIfname if !man.ifnameUsed(preferIfname) { return preferIfname, nil } + ifname := self.generateIfname(network, self.Virtual, false) if !man.ifnameUsed(ifname) { return ifname, nil @@ -568,7 +569,7 @@ func (self *SGuestnetwork) getJsonDesc() *api.GuestnetworkJsonDesc { if routes != nil && len(routes) > 0 { desc.Routes = jsonutils.Marshal(routes) } - desc.Ifname = self.GetIfname() + desc.Ifname = self.Ifname desc.Masklen = net.GuestIpMask desc.Driver = self.Driver desc.NumQueues = self.NumQueues @@ -878,15 +879,6 @@ func (self *SGuestnetwork) GetVirtualIPs() []string { return ips } -func (self *SGuestnetwork) GetIfname() string { - if self.Driver == api.NETWORK_DRIVER_VFIO { - if dev, _ := self.GetIsolatedDevice(); dev != nil && dev.OvsOffloadInterface != "" { - return dev.OvsOffloadInterface - } - } - return self.Ifname -} - func (self *SGuestnetwork) GetIsolatedDevice() (*SIsolatedDevice, error) { dev := SIsolatedDevice{} q := IsolatedDeviceManager.Query().Equals("guest_id", self.GuestId).Equals("network_index", self.Index) diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index 903306c4c9..3207d0e0e3 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -4019,13 +4019,10 @@ func (self *SGuest) CreateNetworksOnHost( if err != nil { return errors.Wrap(err, "self.attach2NetworkDesc") } - net := gns[0].GetNetwork() if netConfig.SriovDevice != nil { - netConfig.SriovDevice.NetworkIndex = &gns[0].Index - netConfig.SriovDevice.WireId = net.WireId - err = self.createIsolatedDeviceOnHost(ctx, userCred, host, netConfig.SriovDevice, pendingUsageZone) + err = self.allocSriovNicDevice(ctx, userCred, host, &gns[0], netConfig, pendingUsageZone) if err != nil { - return errors.Wrap(err, "self.createIsolatedDeviceOnHost") + return errors.Wrap(err, "self.allocSriovNicDevice") } } @@ -4033,6 +4030,36 @@ func (self *SGuest) CreateNetworksOnHost( return nil } +func (self *SGuest) allocSriovNicDevice( + ctx context.Context, + userCred mcclient.TokenCredential, + host *SHost, + gn *SGuestnetwork, netConfig *api.NetworkConfig, + pendingUsageZone quotas.IQuota, +) error { + net := gn.GetNetwork() + netConfig.SriovDevice.NetworkIndex = &gn.Index + netConfig.SriovDevice.WireId = net.WireId + err := self.createIsolatedDeviceOnHost(ctx, userCred, host, netConfig.SriovDevice, pendingUsageZone) + if err != nil { + return errors.Wrap(err, "self.createIsolatedDeviceOnHost") + } + dev, err := self.GetIsolatedDeviceByNetworkIndex(gn.Index) + if err != nil { + return errors.Wrap(err, "self.GetIsolatedDeviceByNetworkIndex") + } + if dev.OvsOffloadInterface != "" { + _, err = db.Update(gn, func() error { + gn.Ifname = dev.OvsOffloadInterface + return nil + }) + if err != nil { + return errors.Wrap(err, "update sriov network ifname") + } + } + return nil +} + func (self *SGuest) attach2NetworkDesc( ctx context.Context, userCred mcclient.TokenCredential, @@ -4100,7 +4127,11 @@ func (self *SGuest) attach2NamedNetworkDesc(ctx context.Context, userCred mcclie } sriovWires = wires } - if !utils.IsInStringArray(net.WireId, sriovWires) { + vpc, err := net.GetVpc() + if err != nil { + return nil, errors.Wrap(err, "attach2NamedNetworkDesc get vpc by network") + } + if vpc.Id == api.DEFAULT_VPC_ID && !utils.IsInStringArray(net.WireId, sriovWires) { return nil, fmt.Errorf("no available sriov nic for wire %s", net.WireId) } } diff --git a/pkg/compute/models/isolated_devices.go b/pkg/compute/models/isolated_devices.go index c764b093e1..d4a4594443 100644 --- a/pkg/compute/models/isolated_devices.go +++ b/pkg/compute/models/isolated_devices.go @@ -591,7 +591,10 @@ func (manager *SIsolatedDeviceManager) findHostUnusedByDevConfig(model, devType, q.Equals("dev_type", devType) } if wireId != "" { - q = q.Equals("wire_id", wireId) + wire := WireManager.FetchWireById(wireId) + if wire.VpcId == api.DEFAULT_VPC_ID { + q = q.Equals("wire_id", wireId) + } } err := db.FetchModelObjects(manager, q, &devs) if err != nil { diff --git a/pkg/hostman/isolated_device/nic.go b/pkg/hostman/isolated_device/nic.go index 6ce86dbdaf..4c92941e75 100644 --- a/pkg/hostman/isolated_device/nic.go +++ b/pkg/hostman/isolated_device/nic.go @@ -281,10 +281,6 @@ func getOvsOffloadNics(hostNics []HostNic) ([]*sOvsOffloadNicDevice, error) { } log.Infof("nic %s link mode %s", nics[i].Interface, linkMode) if strings.TrimSpace(linkMode) != "switchdev" { - err = fileutils2.FilePutContents(devlinkPath, "switchdev\n", false) - if err != nil { - return nil, errors.Wrap(err, "fileutils2.FilePutContents linkMode") - } for j := 0; j < len(vfs); j++ { if strings.HasPrefix(vfs[j].Name(), "virtfn") { vfPath, err := filepath.EvalSymlinks(path.Join(nicDir, vfs[j].Name())) @@ -302,6 +298,10 @@ func getOvsOffloadNics(hostNics []HostNic) ([]*sOvsOffloadNicDevice, error) { } } } + err = fileutils2.FilePutContents(devlinkPath, "switchdev\n", false) + if err != nil { + return nil, errors.Wrap(err, "fileutils2.FilePutContents linkMode") + } } // get interfaces diff --git a/pkg/scheduler/algorithm/predicates/network_predicate.go b/pkg/scheduler/algorithm/predicates/network_predicate.go index 9cbb0c2f8c..82e13338c8 100644 --- a/pkg/scheduler/algorithm/predicates/network_predicate.go +++ b/pkg/scheduler/algorithm/predicates/network_predicate.go @@ -215,7 +215,7 @@ func IsNetworkAvailable( } } - if req.SriovDevice != nil { + if req.SriovDevice != nil && n.VpcId == computeapi.DEFAULT_VPC_ID { err := checkSriovNic(c, n.WireId, req.SriovDevice) if err != nil { return FailReason{