]> xenbits.xensource.com Git - libvirt.git/commitdiff
conf: expand network device callbacks to cover resolving NIC type
authorDaniel P. Berrangé <berrange@redhat.com>
Thu, 25 Jan 2018 09:35:50 +0000 (09:35 +0000)
committerDaniel P. Berrangé <berrange@redhat.com>
Fri, 9 Feb 2018 11:05:10 +0000 (11:05 +0000)
Currently the QEMU driver will call directly into the network driver
impl to modify resolve the atual type of NICs with type=network. It
has todo this before it has allocated the actual NIC. This introduces
a callback system to allow us to decouple the QEMU driver from the
network driver.

This is a short term step, as it ought to be possible to achieve the
same end goal by simply querying XML via the public network API. The
QEMU code in question though, has no virConnectPtr conveniently
available at this time.

Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
src/conf/domain_conf.c
src/conf/domain_conf.h
src/libvirt_private.syms
src/network/bridge_driver.c
src/network/bridge_driver.h
src/qemu/qemu_alias.c
src/qemu/qemu_domain_address.c
tests/Makefile.am
tests/qemuxml2argvtest.c

index 6de9a00fca771b2ce33cf4722baf1a94c4fe610c..1423cf2c5518e0359b1752adbd95541e752f9a7c 100644 (file)
@@ -28823,6 +28823,7 @@ static virDomainNetNotifyActualDeviceImpl netNotify;
 static virDomainNetReleaseActualDeviceImpl netRelease;
 static virDomainNetBandwidthChangeAllowedImpl netBandwidthChangeAllowed;
 static virDomainNetBandwidthUpdateImpl netBandwidthUpdate;
+static virDomainNetResolveActualTypeImpl netResolveActualType;
 
 
 void
@@ -28830,13 +28831,15 @@ virDomainNetSetDeviceImpl(virDomainNetAllocateActualDeviceImpl allocate,
                           virDomainNetNotifyActualDeviceImpl notify,
                           virDomainNetReleaseActualDeviceImpl release,
                           virDomainNetBandwidthChangeAllowedImpl bandwidthChangeAllowed,
-                          virDomainNetBandwidthUpdateImpl bandwidthUpdate)
+                          virDomainNetBandwidthUpdateImpl bandwidthUpdate,
+                          virDomainNetResolveActualTypeImpl resolveActualType)
 {
     netAllocate = allocate;
     netNotify = notify;
     netRelease = release;
     netBandwidthChangeAllowed = bandwidthChangeAllowed;
     netBandwidthUpdate = bandwidthUpdate;
+    netResolveActualType = resolveActualType;
 }
 
 int
@@ -28904,3 +28907,15 @@ virDomainNetBandwidthUpdate(virDomainNetDefPtr iface,
 
     return netBandwidthUpdate(iface, newBandwidth);
 }
+
+int
+virDomainNetResolveActualType(virDomainNetDefPtr iface)
+{
+    if (!netResolveActualType) {
+        virReportError(VIR_ERR_NO_SUPPORT, "%s",
+                       _("Network device resolve type not available"));
+        return -1;
+    }
+
+    return netResolveActualType(iface);
+}
index 3c87bb57273c4acf7b6cdc7267e84b4ff609ebf4..8aba0b562fd898ad56280c3606606011e8cea1e4 100644 (file)
@@ -3476,13 +3476,17 @@ typedef int
 (*virDomainNetBandwidthUpdateImpl)(virDomainNetDefPtr iface,
                                    virNetDevBandwidthPtr newBandwidth);
 
+typedef int
+(*virDomainNetResolveActualTypeImpl)(virDomainNetDefPtr iface);
+
 
 void
 virDomainNetSetDeviceImpl(virDomainNetAllocateActualDeviceImpl allocate,
                           virDomainNetNotifyActualDeviceImpl notify,
                           virDomainNetReleaseActualDeviceImpl release,
                           virDomainNetBandwidthChangeAllowedImpl bandwidthChangeAllowed,
-                          virDomainNetBandwidthUpdateImpl bandwidthUpdate);
+                          virDomainNetBandwidthUpdateImpl bandwidthUpdate,
+                          virDomainNetResolveActualTypeImpl resolveActualType);
 
 int
 virDomainNetAllocateActualDevice(virDomainDefPtr dom,
@@ -3509,5 +3513,14 @@ virDomainNetBandwidthUpdate(virDomainNetDefPtr iface,
                             virNetDevBandwidthPtr newBandwidth)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
 
+/* XXX this is a nasty hack and should be removed. It should
+ * be by via public API by fetching XML and parsing it. Not
+ * easy right now as code paths in QEMU reying on this don't
+ * have a virConnectPtr handy.
+ */
+int
+virDomainNetResolveActualType(virDomainNetDefPtr iface)
+    ATTRIBUTE_NONNULL(1);
+
 
 #endif /* __DOMAIN_CONF_H */
index 45ae25e57ca08133a32aab0a7c58e6275fcca733..f2801a0d730476d0bd07b881ea7f69d2fe762dc1 100644 (file)
@@ -459,6 +459,7 @@ virDomainNetNotifyActualDevice;
 virDomainNetReleaseActualDevice;
 virDomainNetRemove;
 virDomainNetRemoveHostdev;
+virDomainNetResolveActualType;
 virDomainNetSetDeviceImpl;
 virDomainNetTypeFromString;
 virDomainNetTypeSharesHostView;
index 9c0b3c0895b7ed876f07d1b208a880b82d4fe562..dd6e3402eaab6a9509dff7c527e549372c0be0ee 100644 (file)
@@ -5147,8 +5147,7 @@ networkReleaseActualDevice(virDomainDefPtr dom,
 
 
 
-/* networkGetActualType:
- * @dom: domain definition that @iface belongs to
+/* networkResolveActualType:
  * @iface: the original NetDef from the domain
  *
  * Looks up the network reference by iface, and returns the actual
@@ -5156,8 +5155,8 @@ networkReleaseActualDevice(virDomainDefPtr dom,
  *
  * Returns 0 on success, -1 on failure.
  */
-int
-networkGetActualType(virDomainNetDefPtr iface)
+static int
+networkResolveActualType(virDomainNetDefPtr iface)
 {
     virNetworkDriverStatePtr driver = networkGetDriver();
     virNetworkObjPtr obj = NULL;
@@ -5718,7 +5717,8 @@ networkRegister(void)
         networkNotifyActualDevice,
         networkReleaseActualDevice,
         networkBandwidthChangeAllowed,
-        networkBandwidthUpdate);
+        networkBandwidthUpdate,
+        networkResolveActualType);
 
     return 0;
 }
index 6fa6432d13ca7213cfe5a64ca69c0153e38a216f..2cf886a7e6187c37431913e0778e8d1f5c2a2991 100644 (file)
@@ -36,10 +36,6 @@ networkRegister(void);
 
 # if WITH_NETWORK
 
-int
-networkGetActualType(virDomainNetDefPtr iface)
-    ATTRIBUTE_NONNULL(1);
-
 int
 networkDnsmasqConfContents(virNetworkObjPtr obj,
                            const char *pidfile,
@@ -49,7 +45,6 @@ networkDnsmasqConfContents(virNetworkObjPtr obj,
 
 # else
 /* Define no-op replacements that don't drag in any link dependencies.  */
-#  define networkGetActualType(iface) (iface->type)
 #  define networkDnsmasqConfContents(network, pidfile, configstr, \
                     dctx, caps) 0
 
index e8c1256b756c8d2b62fbc702f75145a2291c01dd..ae30f7df826e44b0c33851df3d1437ef4e80b50a 100644 (file)
@@ -27,7 +27,6 @@
 #include "viralloc.h"
 #include "virlog.h"
 #include "virstring.h"
-#include "network/bridge_driver.h"
 
 #define QEMU_DRIVE_HOST_PREFIX "drive-"
 
@@ -271,7 +270,7 @@ qemuAssignDeviceNetAlias(virDomainDefPtr def,
      * We must use "-1" as the index because the caller doesn't know
      * that we're now looking for a unique hostdevN rather than netN
      */
-    if (networkGetActualType(net) == VIR_DOMAIN_NET_TYPE_HOSTDEV)
+    if (virDomainNetResolveActualType(net) == VIR_DOMAIN_NET_TYPE_HOSTDEV)
         return qemuAssignDeviceHostdevAlias(def, &net->info.alias, -1);
 
     if (idx == -1) {
index 6272b1e91da7f6a7ec8a2ffbef37b5690e6cc459..e28119e4b1c326cb0bb6f14d2a2dbb24fdba6be6 100644 (file)
@@ -25,7 +25,6 @@
 
 #include "qemu_domain_address.h"
 #include "qemu_domain.h"
-#include "network/bridge_driver.h"
 #include "viralloc.h"
 #include "virerror.h"
 #include "virlog.h"
@@ -1064,7 +1063,7 @@ qemuDomainFillDeviceIsolationGroup(virDomainDefPtr def,
          * to is of type hostdev. All other kinds of network interfaces don't
          * require us to isolate the guest device, so we can skip them */
         if (iface->type != VIR_DOMAIN_NET_TYPE_NETWORK ||
-            networkGetActualType(iface) != VIR_DOMAIN_NET_TYPE_HOSTDEV) {
+            virDomainNetResolveActualType(iface) != VIR_DOMAIN_NET_TYPE_HOSTDEV) {
             goto skip;
         }
 
index 497bd21a2587650c226bc640e7dbbe51eb4157ef..d013aed5eb80769b3f679de7897df2272b588e69 100644 (file)
@@ -280,7 +280,7 @@ test_libraries += virmocklibxl.la
 endif WITH_LIBXL
 
 if WITH_QEMU
-test_programs += qemuxml2argvtest qemuxml2xmltest \
+test_programs += qemuxml2xmltest \
        qemuargv2xmltest qemuhelptest domainsnapshotxml2xmltest \
        qemumonitortest qemumonitorjsontest qemuhotplugtest \
        qemuagenttest qemucapabilitiestest qemucaps2xmltest \
@@ -288,6 +288,11 @@ test_programs += qemuxml2argvtest qemuxml2xmltest \
        qemucommandutiltest \
        qemublocktest \
        $(NULL)
+if WITH_NETWORK
+# Dep on the network driver callback for resolving NIC
+# actual type. XXX remove this dep.
+test_programs += qemuxml2xmltest
+endif WITH_NETWORK
 test_helpers += qemucapsprobe
 test_libraries += libqemumonitortestutils.la \
                libqemutestdriver.la \
@@ -582,7 +587,9 @@ qemucpumock_la_LIBADD = $(MOCKLIBS_LIBS)
 qemuxml2argvtest_SOURCES = \
        qemuxml2argvtest.c testutilsqemu.c testutilsqemu.h \
        testutils.c testutils.h
-qemuxml2argvtest_LDADD = libqemutestdriver.la $(LDADDS) $(LIBXML_LIBS)
+qemuxml2argvtest_LDADD = libqemutestdriver.la \
+       ../src/libvirt_driver_network_impl.la \
+       $(LDADDS) $(LIBXML_LIBS)
 
 qemuxml2argvmock_la_SOURCES = \
        qemuxml2argvmock.c
index c8739909de3c9e3b8c140621b5353ebec22dae29..b34146714352fa4acb083cfe7e5765b8ea664cbb 100644 (file)
@@ -25,6 +25,7 @@
 # include "cpu/cpu_map.h"
 # include "virstring.h"
 # include "storage/storage_driver.h"
+# include "network/bridge_driver.h"
 # include "virmock.h"
 
 # define __QEMU_CAPSPRIV_H_ALLOW__
@@ -580,6 +581,9 @@ mymain(void)
     if (qemuTestDriverInit(&driver) < 0)
         return EXIT_FAILURE;
 
+    if (networkRegister() < 0)
+        return EXIT_FAILURE;
+
     driver.privileged = true;
 
     VIR_FREE(driver.config->defaultTLSx509certdir);