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 <lhuang(a)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!