From 0c63c117a2d17f66b05dd83e50aa36ac0b0c9843 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= Date: Fri, 9 Feb 2018 15:08:53 +0000 Subject: [PATCH] conf: reimplement virDomainNetResolveActualType in terms of public API MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Now that we have the ability to easily open connections to secondary drivers, eg network:///system, it is possible to reimplement the virDomainNetResolveActualType method in terms of the public API. This avoids the need to have the network driver provide a callback for it. Reviewed-by: John Ferlan Signed-off-by: Daniel P. Berrangé --- src/conf/domain_conf.c | 80 +++++++++++++++++++++++++++++++++---- src/conf/domain_conf.h | 11 +---- src/network/bridge_driver.c | 76 +---------------------------------- tests/Makefile.am | 7 +--- 4 files changed, 75 insertions(+), 99 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 2b99d32790..3f57d22b7d 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -28926,7 +28926,6 @@ static virDomainNetNotifyActualDeviceImpl netNotify; static virDomainNetReleaseActualDeviceImpl netRelease; static virDomainNetBandwidthChangeAllowedImpl netBandwidthChangeAllowed; static virDomainNetBandwidthUpdateImpl netBandwidthUpdate; -static virDomainNetResolveActualTypeImpl netResolveActualType; void @@ -28934,15 +28933,13 @@ virDomainNetSetDeviceImpl(virDomainNetAllocateActualDeviceImpl allocate, virDomainNetNotifyActualDeviceImpl notify, virDomainNetReleaseActualDeviceImpl release, virDomainNetBandwidthChangeAllowedImpl bandwidthChangeAllowed, - virDomainNetBandwidthUpdateImpl bandwidthUpdate, - virDomainNetResolveActualTypeImpl resolveActualType) + virDomainNetBandwidthUpdateImpl bandwidthUpdate) { netAllocate = allocate; netNotify = notify; netRelease = release; netBandwidthChangeAllowed = bandwidthChangeAllowed; netBandwidthUpdate = bandwidthUpdate; - netResolveActualType = resolveActualType; } int @@ -29011,16 +29008,83 @@ virDomainNetBandwidthUpdate(virDomainNetDefPtr iface, return netBandwidthUpdate(iface, newBandwidth); } +/* virDomainNetResolveActualType: + * @iface: the original NetDef from the domain + * + * Looks up the network reference by iface, and returns the actual + * type of the connection without allocating any resources. + * + * Returns 0 on success, -1 on failure. + */ int virDomainNetResolveActualType(virDomainNetDefPtr iface) { - if (!netResolveActualType) { - virReportError(VIR_ERR_NO_SUPPORT, "%s", - _("Network device resolve type not available")); + virConnectPtr conn = NULL; + virNetworkPtr net = NULL; + char *xml = NULL; + virNetworkDefPtr def = NULL; + int ret = -1; + + if (iface->type != VIR_DOMAIN_NET_TYPE_NETWORK) + return iface->type; + + if (iface->data.network.actual) + return iface->data.network.actual->type; + + if (!(conn = virGetConnectNetwork())) return -1; + + if (!(net = virNetworkLookupByName(conn, iface->data.network.name))) + goto cleanup; + + if (!(xml = virNetworkGetXMLDesc(net, 0))) + goto cleanup; + + if (!(def = virNetworkDefParseString(xml))) + goto cleanup; + + if ((def->forward.type == VIR_NETWORK_FORWARD_NONE) || + (def->forward.type == VIR_NETWORK_FORWARD_NAT) || + (def->forward.type == VIR_NETWORK_FORWARD_ROUTE) || + (def->forward.type == VIR_NETWORK_FORWARD_OPEN)) { + /* for these forward types, the actual net type really *is* + * NETWORK; we just keep the info from the portgroup in + * iface->data.network.actual + */ + ret = VIR_DOMAIN_NET_TYPE_NETWORK; + + } else if ((def->forward.type == VIR_NETWORK_FORWARD_BRIDGE) && + def->bridge) { + + /* + * is VIR_DOMAIN_NET_TYPE_BRIDGE + */ + + ret = VIR_DOMAIN_NET_TYPE_BRIDGE; + + } else if (def->forward.type == VIR_NETWORK_FORWARD_HOSTDEV) { + + ret = VIR_DOMAIN_NET_TYPE_HOSTDEV; + + } else if ((def->forward.type == VIR_NETWORK_FORWARD_BRIDGE) || + (def->forward.type == VIR_NETWORK_FORWARD_PRIVATE) || + (def->forward.type == VIR_NETWORK_FORWARD_VEPA) || + (def->forward.type == VIR_NETWORK_FORWARD_PASSTHROUGH)) { + + /* are all + * VIR_DOMAIN_NET_TYPE_DIRECT. + */ + + ret = VIR_DOMAIN_NET_TYPE_DIRECT; + } - return netResolveActualType(iface); + cleanup: + virNetworkDefFree(def); + VIR_FREE(xml); + virObjectUnref(conn); + virObjectUnref(net); + return ret; } diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index e6212818aa..eda69a3c11 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -3474,17 +3474,13 @@ typedef int (*virDomainNetBandwidthUpdateImpl)(virDomainNetDefPtr iface, virNetDevBandwidthPtr newBandwidth); -typedef int -(*virDomainNetResolveActualTypeImpl)(virDomainNetDefPtr iface); - void virDomainNetSetDeviceImpl(virDomainNetAllocateActualDeviceImpl allocate, virDomainNetNotifyActualDeviceImpl notify, virDomainNetReleaseActualDeviceImpl release, virDomainNetBandwidthChangeAllowedImpl bandwidthChangeAllowed, - virDomainNetBandwidthUpdateImpl bandwidthUpdate, - virDomainNetResolveActualTypeImpl resolveActualType); + virDomainNetBandwidthUpdateImpl bandwidthUpdate); int virDomainNetAllocateActualDevice(virDomainDefPtr dom, @@ -3511,11 +3507,6 @@ 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); diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index dd6e3402ea..898c946101 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -5146,79 +5146,6 @@ networkReleaseActualDevice(virDomainDefPtr dom, } - -/* networkResolveActualType: - * @iface: the original NetDef from the domain - * - * Looks up the network reference by iface, and returns the actual - * type of the connection without allocating any resources. - * - * Returns 0 on success, -1 on failure. - */ -static int -networkResolveActualType(virDomainNetDefPtr iface) -{ - virNetworkDriverStatePtr driver = networkGetDriver(); - virNetworkObjPtr obj = NULL; - virNetworkDefPtr netdef = NULL; - int ret = -1; - - if (!driver || iface->type != VIR_DOMAIN_NET_TYPE_NETWORK) - return iface->type; - - if (iface->data.network.actual) - return iface->data.network.actual->type; - - obj = virNetworkObjFindByName(driver->networks, iface->data.network.name); - if (!obj) { - virReportError(VIR_ERR_NO_NETWORK, - _("no network with matching name '%s'"), - iface->data.network.name); - return -1; - } - netdef = virNetworkObjGetDef(obj); - - if ((netdef->forward.type == VIR_NETWORK_FORWARD_NONE) || - (netdef->forward.type == VIR_NETWORK_FORWARD_NAT) || - (netdef->forward.type == VIR_NETWORK_FORWARD_ROUTE) || - (netdef->forward.type == VIR_NETWORK_FORWARD_OPEN)) { - /* for these forward types, the actual net type really *is* - * NETWORK; we just keep the info from the portgroup in - * iface->data.network.actual - */ - ret = VIR_DOMAIN_NET_TYPE_NETWORK; - - } else if ((netdef->forward.type == VIR_NETWORK_FORWARD_BRIDGE) && - netdef->bridge) { - - /* - * is VIR_DOMAIN_NET_TYPE_BRIDGE - */ - - ret = VIR_DOMAIN_NET_TYPE_BRIDGE; - - } else if (netdef->forward.type == VIR_NETWORK_FORWARD_HOSTDEV) { - - ret = VIR_DOMAIN_NET_TYPE_HOSTDEV; - - } else if ((netdef->forward.type == VIR_NETWORK_FORWARD_BRIDGE) || - (netdef->forward.type == VIR_NETWORK_FORWARD_PRIVATE) || - (netdef->forward.type == VIR_NETWORK_FORWARD_VEPA) || - (netdef->forward.type == VIR_NETWORK_FORWARD_PASSTHROUGH)) { - - /* are all - * VIR_DOMAIN_NET_TYPE_DIRECT. - */ - - ret = VIR_DOMAIN_NET_TYPE_DIRECT; - - } - - virNetworkObjEndAPI(&obj); - return ret; -} - - /** * networkCheckBandwidth: * @net: network QoS @@ -5717,8 +5644,7 @@ networkRegister(void) networkNotifyActualDevice, networkReleaseActualDevice, networkBandwidthChangeAllowed, - networkBandwidthUpdate, - networkResolveActualType); + networkBandwidthUpdate); return 0; } diff --git a/tests/Makefile.am b/tests/Makefile.am index 4ff3fa742a..d9b3a99477 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -280,7 +280,7 @@ test_libraries += virmocklibxl.la endif WITH_LIBXL if WITH_QEMU -test_programs += qemuxml2xmltest \ +test_programs += qemuxml2argvtest qemuxml2xmltest \ qemuargv2xmltest qemuhelptest domainsnapshotxml2xmltest \ qemumonitortest qemumonitorjsontest qemuhotplugtest \ qemuagenttest qemucapabilitiestest qemucaps2xmltest \ @@ -288,11 +288,6 @@ test_programs += qemuxml2xmltest \ qemucommandutiltest \ qemublocktest \ $(NULL) -if WITH_NETWORK -# Dep on the network driver callback for resolving NIC -# actual type. XXX remove this dep. -test_programs += qemuxml2argvtest -endif WITH_NETWORK test_helpers += qemucapsprobe test_libraries += libqemumonitortestutils.la \ libqemutestdriver.la \