From d3da7426f2058b1ea73c41d7edb2cac051802b2d Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Wed, 14 Jul 2021 21:02:00 +0800 Subject: [PATCH] fix: migrate interface before commit desc --- pkg/compute/models/guest_migrate_network.go | 1 + pkg/hostman/guestman/guesttasks.go | 35 +------------- pkg/hostman/guestman/qemu-kvm.go | 53 +++++++++++++++++++-- 3 files changed, 51 insertions(+), 38 deletions(-) diff --git a/pkg/compute/models/guest_migrate_network.go b/pkg/compute/models/guest_migrate_network.go index 7280c292b3..1ba352a2a9 100644 --- a/pkg/compute/models/guest_migrate_network.go +++ b/pkg/compute/models/guest_migrate_network.go @@ -133,6 +133,7 @@ func (guest *SGuest) PerformMigrateNetwork(ctx context.Context, userCred mcclien // perform the database change _, err = db.Update(&srcNic, func() error { srcNic.NetworkId = destNet.Id + srcNic.MappedIpAddr = "" // reset MappedIpAddr anyway return nil }) if err != nil { diff --git a/pkg/hostman/guestman/guesttasks.go b/pkg/hostman/guestman/guesttasks.go index 534dc99b8a..3b1cc602d6 100644 --- a/pkg/hostman/guestman/guesttasks.go +++ b/pkg/hostman/guestman/guesttasks.go @@ -342,8 +342,6 @@ type SGuestNetworkSyncTask struct { addNics []jsonutils.JSONObject errors []error - changedNics [][]jsonutils.JSONObject - callback func(...error) } @@ -362,39 +360,10 @@ 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) { @@ -491,8 +460,8 @@ func (n *SGuestNetworkSyncTask) onDeviceAdd(nic jsonutils.JSONObject) { n.syncNetworkConf() } -func NewGuestNetworkSyncTask(guest *SKVMGuestInstance, delNics, addNics []jsonutils.JSONObject, changedNics [][]jsonutils.JSONObject) *SGuestNetworkSyncTask { - return &SGuestNetworkSyncTask{guest, delNics, addNics, make([]error, 0), changedNics, nil} +func NewGuestNetworkSyncTask(guest *SKVMGuestInstance, delNics, addNics []jsonutils.JSONObject) *SGuestNetworkSyncTask { + return &SGuestNetworkSyncTask{guest, delNics, addNics, make([]error, 0), nil} } /** diff --git a/pkg/hostman/guestman/qemu-kvm.go b/pkg/hostman/guestman/qemu-kvm.go index bbfe0d28cb..6389d80e67 100644 --- a/pkg/hostman/guestman/qemu-kvm.go +++ b/pkg/hostman/guestman/qemu-kvm.go @@ -790,12 +790,10 @@ func (s *SKVMGuestInstance) SaveDesc(desc jsonutils.JSONObject) error { { // fill in ovn vpc nic bridge field nics, _ := s.Desc.GetArray("nics") - ovnBridge := options.HostOptions.OvnIntegrationBridge for _, nic := range nics { - vpcProvider, _ := nic.GetString("vpc", "provider") - if vpcProvider == compute.VPC_PROVIDER_OVN { + if !nic.Contains("bridge") { nicjd := nic.(*jsonutils.JSONDict) - nicjd.Set("bridge", jsonutils.NewString(ovnBridge)) + nicjd.Set("bridge", jsonutils.NewString(getNicBridge(nic))) } } } @@ -1147,6 +1145,40 @@ func (s *SKVMGuestInstance) compareDescNetworks(newDesc jsonutils.JSONObject) ([ return delNics, addNics, changedNics } +func getNicBridge(nic jsonutils.JSONObject) string { + bridge, _ := nic.GetString("bridge") + if len(bridge) == 0 { + vpcProvider, _ := nic.GetString("vpc", "provider") + if vpcProvider == compute.VPC_PROVIDER_OVN { + bridge = options.HostOptions.OvnIntegrationBridge + } + } + return bridge +} + +func onNicChange(oldNic, newNic jsonutils.JSONObject) error { + oldbr := getNicBridge(oldNic) + oldifname, _ := oldNic.GetString("ifname") + newbr := getNicBridge(newNic) + newifname, _ := newNic.GetString("ifname") + if oldbr != newbr { + // bridge changed + if oldifname == newifname { + output, err := procutils.NewRemoteCommandAsFarAsPossible("ovs-vsctl", + "--", "del-port", oldbr, oldifname, + "--", "add-port", newbr, newifname, + ).Output() + log.Infof("ovs-vsctl del-port %s %s add-port %s %s: %s", oldbr, oldifname, newbr, newifname, output) + if err != nil { + return errors.Wrap(err, "NewRemoteCommandAsFarAsPossible") + } + } else { + log.Errorf("cannot change both bridge(%s!=%s) and ifname(%s!=%s)!!!!!", oldbr, newbr, oldifname, newifname) + } + } + return nil +} + 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 @@ -1157,6 +1189,17 @@ func (s *SKVMGuestInstance) SyncConfig(ctx context.Context, desc jsonutils.JSONO cdrom = s.compareDescCdrom(desc) delNetworks, addNetworks, changedNetworks = s.compareDescNetworks(desc) } + + if len(changedNetworks) > 0 && s.IsRunning() { + // process changed networks + for i := range changedNetworks { + err := onNicChange(changedNetworks[i][0], changedNetworks[i][1]) + if err != nil { + return nil, errors.Wrap(err, "onNicChange") + } + } + } + if err := s.SaveDesc(desc); err != nil { return nil, err } @@ -1199,7 +1242,7 @@ func (s *SKVMGuestInstance) SyncConfig(ctx context.Context, desc jsonutils.JSONO } if len(delNetworks)+len(addNetworks) > 0 { - task := NewGuestNetworkSyncTask(s, delNetworks, addNetworks, changedNetworks) + task := NewGuestNetworkSyncTask(s, delNetworks, addNetworks) runTaskNames = append(runTaskNames, jsonutils.NewString("networksync")) tasks = append(tasks, task) }