On 02/17/2015 09:42 PM, Antoni Segura Puimedon wrote:
> Use the utilities introduced in the previous patches so the qemu
> driver is able to create tap devices that are bound (and unbound
> on domain destroyal) to Midonet virtual ports.
>
> Signed-off-by: Antoni Segura Puimedon <toni+libvirt@midokura.com>
> ---
> src/conf/domain_conf.h | 1 +
> src/conf/netdev_vport_profile_conf.c | 3 ++-
Changes to the parser/formatter should be in the same patch as the
schema/docs changes.
To pre-emptively prevent bugs if we ever have to add code to
> src/qemu/qemu_hotplug.c | 25 ++++++++++++++++++-------
> src/qemu/qemu_process.c | 13 +++++++++----
> src/util/virnetdevtap.c | 11 ++++++++---
> 5 files changed, 38 insertions(+), 15 deletions(-)
>
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index 325afa8..cafe50f 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -42,6 +42,7 @@
> # include "virnetdevmacvlan.h"
> # include "virsysinfo.h"
> # include "virnetdevvportprofile.h"
> +# include "virnetdevmidonet.h"
> # include "virnetdevopenvswitch.h"
> # include "virnetdevbandwidth.h"
> # include "virnetdevvlan.h"
> diff --git a/src/conf/netdev_vport_profile_conf.c b/src/conf/netdev_vport_profile_conf.c
> index 8da0838..1641a3e 100644
> --- a/src/conf/netdev_vport_profile_conf.c
> +++ b/src/conf/netdev_vport_profile_conf.c
> @@ -260,7 +260,8 @@ virNetDevVPortProfileFormat(virNetDevVPortProfilePtr virtPort,
> virBufferAsprintf(buf, " instanceid='%s'", uuidstr);
> }
> if (virtPort->interfaceID_specified &&
> - (type == VIR_NETDEV_VPORT_PROFILE_OPENVSWITCH ||
> + (type == VIR_NETDEV_VPORT_PROFILE_MIDONET ||
> + type == VIR_NETDEV_VPORT_PROFILE_OPENVSWITCH ||
> type == VIR_NETDEV_VPORT_PROFILE_NONE)) {
> char uuidstr[VIR_UUID_STRING_BUFLEN];
>
> diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
> index 8691c7e..34d7988 100644
> --- a/src/qemu/qemu_hotplug.c
> +++ b/src/qemu/qemu_hotplug.c
> @@ -1141,9 +1141,15 @@ int qemuDomainAttachNetDevice(virConnectPtr conn,
> }
>
> vport = virDomainNetGetActualVirtPortProfile(net);
> - if (vport && vport->virtPortType == VIR_NETDEV_VPORT_PROFILE_OPENVSWITCH)
> - ignore_value(virNetDevOpenvswitchRemovePort(
> - virDomainNetGetActualBridgeName(net), net->ifname));
> + if (vport) {
> + if (vport->virtPortType == VIR_NETDEV_VPORT_PROFILE_MIDONET) {
> + ignore_value(virNetDevMidonetUnbindPort(vport));
> + } else if (vport->virtPortType == VIR_NETDEV_VPORT_PROFILE_OPENVSWITCH) {
> + ignore_value(virNetDevOpenvswitchRemovePort(
> + virDomainNetGetActualBridgeName(net),
> + net->ifname));
> + }
> + }
specifically disconnect from standard bridges (unlikely but possible),
I think these if's shouldn't be nested. Instead it should be:
if (vpor && vport->virtPortType == OPENVSWITCH) {
ovs stuff
} else if (vport && vport->virtPortType == MIDONET) {
midonet stuff
}
(that way we can just add an "else" clause if we have to without
restructuring anything else).
> }
>
> virDomainNetRemoveHostdev(vm->def, net);
> @@ -2934,10 +2940,15 @@ qemuDomainRemoveNetDevice(virQEMUDriverPtr driver,
> }
>
> vport = virDomainNetGetActualVirtPortProfile(net);
> - if (vport && vport->virtPortType == VIR_NETDEV_VPORT_PROFILE_OPENVSWITCH)
> - ignore_value(virNetDevOpenvswitchRemovePort(
> - virDomainNetGetActualBridgeName(net),
> - net->ifname));
> + if (vport) {
> + if (vport->virtPortType == VIR_NETDEV_VPORT_PROFILE_MIDONET) {
> + ignore_value(virNetDevMidonetUnbindPort(vport));
> + } else if (vport->virtPortType == VIR_NETDEV_VPORT_PROFILE_OPENVSWITCH) {
> + ignore_value(virNetDevOpenvswitchRemovePort(
> + virDomainNetGetActualBridgeName(net),
> + net->ifname));
> + }
> + }
See the comment above. Same applies here.
>
> networkReleaseActualDevice(vm->def, net);
> virDomainNetDefFree(net);
> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index 1d4e957..982f802 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -5291,10 +5291,15 @@ void qemuProcessStop(virQEMUDriverPtr driver,
> /* release the physical device (or any other resources used by
> * this interface in the network driver
> */
> - if (vport && vport->virtPortType == VIR_NETDEV_VPORT_PROFILE_OPENVSWITCH)
> - ignore_value(virNetDevOpenvswitchRemovePort(
> - virDomainNetGetActualBridgeName(net),
> - net->ifname));
> + if (vport) {
> + if (vport->virtPortType == VIR_NETDEV_VPORT_PROFILE_MIDONET) {
> + ignore_value(virNetDevMidonetUnbindPort(vport));
> + } else if (vport->virtPortType == VIR_NETDEV_VPORT_PROFILE_OPENVSWITCH) {
> + ignore_value(virNetDevOpenvswitchRemovePort(
> + virDomainNetGetActualBridgeName(net),
> + net->ifname));
> + }
> + }
and here.
I know you didn't create the problem in this case, but I think here the
>
> /* kick the device out of the hostdev list too */
> virDomainNetRemoveHostdev(def, net);
> diff --git a/src/util/virnetdevtap.c b/src/util/virnetdevtap.c
> index 83b4131..f6152e9 100644
> --- a/src/util/virnetdevtap.c
> +++ b/src/util/virnetdevtap.c
> @@ -26,6 +26,7 @@
> #include "virnetdevtap.h"
> #include "virnetdev.h"
> #include "virnetdevbridge.h"
> +#include "virnetdevmidonet.h"
> #include "virnetdevopenvswitch.h"
> #include "virerror.h"
> #include "virfile.h"
> @@ -580,9 +581,13 @@ int virNetDevTapCreateInBridgePort(const char *brname,
> goto error;
>
> if (virtPortProfile) {
> - if (virNetDevOpenvswitchAddPort(brname, *ifname, macaddr, vmuuid,
> - virtPortProfile, virtVlan) < 0) {
> - goto error;
> + if (virtPortProfile->virtPortType == VIR_NETDEV_VPORT_PROFILE_MIDONET) {
> + if (virNetDevMidonetBindPort(*ifname, virtPortProfile) < 0)
> + goto error;
> + } else {
> + if (virNetDevOpenvswitchAddPort(brname, *ifname, macaddr, vmuuid,
> + virtPortProfile, virtVlan) < 0)
> + goto error;
> }
> } else {
> if (virNetDevBridgeAddPort(brname, *ifname) < 0)
logic should be the following:
if (virtPortProfile && virtPortType == OPENVSWITCH) {
virNetDevOpenvswitchAddPort(blah)
} else if (virtPortProfile && virtPortType == MIDONET) {
virNetDevMidonetBindPort(blah)
} else {
virNetDevBridgeAddPort(blah)
}
That way if someone specifies a <virtualport> as a placeholder, but no
type, they will still get attached to a standard bridge (which is almost
surely what they will expect).