fix: add codes to switch bridge of ovs port

This commit is contained in:
Qiu Jian
2021-07-14 16:31:22 +08:00
parent 0d3cfac329
commit 58313432f1
2 changed files with 47 additions and 7 deletions
+33 -2
View File
@@ -342,6 +342,8 @@ type SGuestNetworkSyncTask struct {
addNics []jsonutils.JSONObject
errors []error
changedNics [][]jsonutils.JSONObject
callback func(...error)
}
@@ -360,10 +362,39 @@ func (n *SGuestNetworkSyncTask) syncNetworkConf() {
n.addNics = n.addNics[:len(n.addNics)-1]
n.addNic(nic)
} else {
if len(n.changedNics) > 0 {
for i := range n.changedNics {
n.onNicChange(n.changedNics[i][0], n.changedNics[i][1])
}
}
n.callback(n.errors...)
}
}
func (n *SGuestNetworkSyncTask) onNicChange(oldNic, newNic jsonutils.JSONObject) {
oldbr, _ := oldNic.GetString("bridge")
oldifname, _ := oldNic.GetString("ifname")
newbr, _ := newNic.GetString("bridge")
newifname, _ := newNic.GetString("ifname")
if oldbr != newbr {
// bridge changed
if oldifname == newifname {
output, err := procutils.NewRemoteCommandAsFarAsPossible("ovs-vsctl", "del-port", oldbr, oldifname).Output()
log.Debugf("ovs-vsctl del-port %s %s: %s", oldbr, oldifname, output)
if err != nil {
n.errors = append(n.errors, err)
}
output, err = procutils.NewRemoteCommandAsFarAsPossible("ovs-vsctl", "add-port", newbr, newifname).Output()
log.Debugf("ovs-vsctl add-port %s %s: %s", newbr, newifname, output)
if err != nil {
n.errors = append(n.errors, err)
}
} else {
log.Errorf("cannot change both bridge(%s!=%s) and ifname(%s!=%s)!!!!!", oldbr, newbr, oldifname, newifname)
}
}
}
func (n *SGuestNetworkSyncTask) removeNic(nic jsonutils.JSONObject) {
ifname, _ := nic.GetString("ifname")
callback := func(res string) {
@@ -460,8 +491,8 @@ func (n *SGuestNetworkSyncTask) onDeviceAdd(nic jsonutils.JSONObject) {
n.syncNetworkConf()
}
func NewGuestNetworkSyncTask(guest *SKVMGuestInstance, delNics, addNics []jsonutils.JSONObject) *SGuestNetworkSyncTask {
return &SGuestNetworkSyncTask{guest, delNics, addNics, make([]error, 0), nil}
func NewGuestNetworkSyncTask(guest *SKVMGuestInstance, delNics, addNics []jsonutils.JSONObject, changedNics [][]jsonutils.JSONObject) *SGuestNetworkSyncTask {
return &SGuestNetworkSyncTask{guest, delNics, addNics, make([]error, 0), changedNics, nil}
}
/**
+14 -5
View File
@@ -1099,7 +1099,7 @@ func (s *SKVMGuestInstance) compareDescCdrom(newDesc jsonutils.JSONObject) *stri
}
}
func (s *SKVMGuestInstance) compareDescNetworks(newDesc jsonutils.JSONObject) ([]jsonutils.JSONObject, []jsonutils.JSONObject) {
func (s *SKVMGuestInstance) compareDescNetworks(newDesc jsonutils.JSONObject) ([]jsonutils.JSONObject, []jsonutils.JSONObject, [][]jsonutils.JSONObject) {
var isValid = func(net jsonutils.JSONObject) bool {
driver, _ := net.GetString("driver")
return driver == "virtio"
@@ -1117,9 +1117,11 @@ func (s *SKVMGuestInstance) compareDescNetworks(newDesc jsonutils.JSONObject) ([
}
var delNics, addNics = []jsonutils.JSONObject{}, []jsonutils.JSONObject{}
var changedNics = [][]jsonutils.JSONObject{}
nics, _ := newDesc.GetArray("nics")
for _, n := range nics {
if isValid(n) {
// assume all nics in new desc are new
addNics = append(addNics, n)
}
}
@@ -1129,24 +1131,31 @@ func (s *SKVMGuestInstance) compareDescNetworks(newDesc jsonutils.JSONObject) ([
if isValid(n) {
idx := findNet(addNics, n)
if idx >= 0 {
// remove n
// check if bridge changed
changedNics = append(changedNics, []jsonutils.JSONObject{
n, // old
addNics[idx], // new
})
// remove existing nic from new
addNics = append(addNics[:idx], addNics[idx+1:]...)
} else {
// not found, remove the nic
delNics = append(delNics, n)
}
}
}
return delNics, addNics
return delNics, addNics, changedNics
}
func (s *SKVMGuestInstance) SyncConfig(ctx context.Context, desc jsonutils.JSONObject, fwOnly bool) (jsonutils.JSONObject, error) {
var delDisks, addDisks, delNetworks, addNetworks []jsonutils.JSONObject
var changedNetworks [][]jsonutils.JSONObject
var cdrom *string
if !fwOnly {
delDisks, addDisks = s.compareDescDisks(desc)
cdrom = s.compareDescCdrom(desc)
delNetworks, addNetworks = s.compareDescNetworks(desc)
delNetworks, addNetworks, changedNetworks = s.compareDescNetworks(desc)
}
if err := s.SaveDesc(desc); err != nil {
return nil, err
@@ -1190,7 +1199,7 @@ func (s *SKVMGuestInstance) SyncConfig(ctx context.Context, desc jsonutils.JSONO
}
if len(delNetworks)+len(addNetworks) > 0 {
task := NewGuestNetworkSyncTask(s, delNetworks, addNetworks)
task := NewGuestNetworkSyncTask(s, delNetworks, addNetworks, changedNetworks)
runTaskNames = append(runTaskNames, jsonutils.NewString("networksync"))
tasks = append(tasks, task)
}