Merge pull request #17509 from wanyaoqi/feat/ovs-offload-vpc-support

fix(region,scheduler): ovs offload support vpc network
This commit is contained in:
Zexi Li
2023-07-13 21:45:07 +08:00
committed by GitHub
5 changed files with 48 additions and 22 deletions
+2 -10
View File
@@ -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)
+37 -6
View File
@@ -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)
}
}
+4 -1
View File
@@ -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 {
+4 -4
View File
@@ -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
@@ -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{