On 01/07/2015 08:16 PM, Jiri Denemark wrote:
On Thu, Dec 25, 2014 at 11:38:00 +0800, Luyao Huang wrote:
https://bugzilla.redhat.com/show_bug.cgi?id=1177194

When migrate a vm, we will generate a xml via qemuDomainDefFormatLive and
pass this xml to target libvirtd. Libvirt will use the current network
state in def->data.network.actual to generate the xml, this will make
migrate failed when we set a network type guest interface use a macvtap
network as a source in a vm then migrate vm to another host(which has the
different macvtap network settings: different interface name, bridge name...)

Add a flag check in virDomainNetDefFormat, if we set a VIR_DOMAIN_XML_MIGRATABLE
flag when call virDomainNetDefFormat, we won't get the current vm interface
state.

Signed-off-by: Luyao Huang <lhu...@redhat.com>
---
  src/conf/domain_conf.c | 4 +++-
  1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index aafc05e..fffd6cd 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -17436,7 +17436,9 @@ virDomainNetDefFormat(virBufferPtr buf,
      unsigned int actualType = virDomainNetGetActualType(def);
      bool publicActual
         = (def->type == VIR_DOMAIN_NET_TYPE_NETWORK && def->data.network.actual 
&&
-          !(flags & (VIR_DOMAIN_XML_INACTIVE | 
VIR_DOMAIN_XML_INTERNAL_ACTUAL_NET)));
+          !(flags & (VIR_DOMAIN_XML_INACTIVE |
+                     VIR_DOMAIN_XML_INTERNAL_ACTUAL_NET |
+                     VIR_DOMAIN_XML_MIGRATABLE)));
      const char *typeStr;
      virDomainHostdevDefPtr hostdef = NULL;
      char macstr[VIR_MAC_STRING_BUFLEN];
ACK, however the initialization of publicActual looks ugly (not your
fault) so a changed it a bit before pushing.

Thanks for your  review!
Jirka

@@ -17705,18 +17705,23 @@ virDomainNetDefFormat(virBufferPtr buf,
                        virDomainNetDefPtr def,
                        unsigned int flags)
  {
-    /* publicActual is true if we should report the current state in
-     * def->data.network.actual *instead of* the config (*not* in
-     * addition to)
-     */
      unsigned int actualType = virDomainNetGetActualType(def);
-    bool publicActual
-       = (def->type == VIR_DOMAIN_NET_TYPE_NETWORK && def->data.network.actual 
&&
-          !(flags & (VIR_DOMAIN_XML_INACTIVE | 
VIR_DOMAIN_XML_INTERNAL_ACTUAL_NET)));
+    bool publicActual = false;
      const char *typeStr;
      virDomainHostdevDefPtr hostdef = NULL;
      char macstr[VIR_MAC_STRING_BUFLEN];
+ /* publicActual is true if we should report the current state in
+     * def->data.network.actual *instead of* the config (*not* in
+     * addition to)
+     */
+    if (def->type == VIR_DOMAIN_NET_TYPE_NETWORK &&
+        def->data.network.actual &&
+        !(flags & (VIR_DOMAIN_XML_INACTIVE |
+                   VIR_DOMAIN_XML_INTERNAL_ACTUAL_NET |
+                   VIR_DOMAIN_XML_MIGRATABLE)))
+        publicActual = true;
+
      if (publicActual) {
          if (!(typeStr = virDomainNetTypeToString(actualType))) {
              virReportError(VIR_ERR_INTERNAL_ERROR,

yep, the codes looks beautiful now, thanks your help!

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to