mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-24 16:03:43 +08:00
Merge pull request #17509 from wanyaoqi/feat/ovs-offload-vpc-support
fix(region,scheduler): ovs offload support vpc network
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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{
|
||||
|
||||
Reference in New Issue
Block a user