[libvirt] [PATCH v3 17/36] conf: add APIs to convert virDomainNetDef to virNetworkPortDef
Daniel P. Berrangé
berrange at redhat.com
Fri Mar 22 17:23:53 UTC 2019
On Fri, Mar 22, 2019 at 01:11:34PM -0400, Laine Stump wrote:
> On 3/19/19 8:46 AM, Daniel P. Berrangé wrote:
> > Helper APIs are needed to
> >
> > - Populate basic virNetworkPortDef from virDomainNetDef
> > - Set a virDomainActualNetDef from virNetworkPortDef
> > - Populate a full virNetworkPortDef from virDomainActualNetDef
> >
> > Signed-off-by: Daniel P. Berrangé <berrange at redhat.com>
> > ---
> > src/conf/domain_conf.c | 272 +++++++++++++++++++++++++++++++++++++++
> > src/conf/domain_conf.h | 17 +++
> > src/libvirt_private.syms | 3 +
> > 3 files changed, 292 insertions(+)
> >
> > diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> > index d283feaca6..ee4d586d77 100644
> > --- a/src/conf/domain_conf.c
> > +++ b/src/conf/domain_conf.c
> > @@ -39,6 +39,7 @@
> > #include "virbuffer.h"
> > #include "virlog.h"
> > #include "nwfilter_conf.h"
> > +#include "virnetworkportdef.h"
> > #include "storage_conf.h"
> > #include "virstoragefile.h"
> > #include "virfile.h"
> > @@ -30161,6 +30162,277 @@ virDomainNetTypeSharesHostView(const virDomainNetDef *net)
> > return false;
> > }
> > +virNetworkPortDefPtr
> > +virDomainNetDefToNetworkPort(virDomainDefPtr dom,
> > + virDomainNetDefPtr iface)
> > +{
> > + virNetworkPortDefPtr port;
> > +
> > + if (iface->type != VIR_DOMAIN_NET_TYPE_NETWORK) {
> > + virReportError(VIR_ERR_INTERNAL_ERROR,
> > + _("Expected an interface of type 'network' not '%s'"),
> > + virDomainNetTypeToString(iface->type));
> > + return NULL;
> > + }
> > +
> > + if (VIR_ALLOC(port) < 0)
> > + return NULL;
> > +
> > + virUUIDGenerate(port->uuid);
> > +
> > + memcpy(port->owneruuid, dom->uuid, VIR_UUID_BUFLEN);
> > + if (VIR_STRDUP(port->ownername, dom->name) < 0)
> > + goto error;
>
>
> It's not important, but was there any reason you put the above two items
> out of order wrt the virNetworkPortDef struct? Having them in order would
> make it simpler to verify nothing had been missed.
>
>
> > +
> > + if (VIR_STRDUP(port->group, iface->data.network.portgroup) < 0)
> > + goto error;
> > +
> > + memcpy(&port->mac, &iface->mac, VIR_MAC_BUFLEN);
> > +
> > + if (virNetDevVPortProfileCopy(&port->virtPortProfile, iface->virtPortProfile) < 0)
> > + goto error;
> > +
> > + if (virNetDevBandwidthCopy(&port->bandwidth, iface->bandwidth) < 0)
> > + goto error;
> > +
> > + if (virNetDevVlanCopy(&port->vlan, &iface->vlan) < 0)
> > + goto error;
> > +
> > + port->trustGuestRxFilters = iface->trustGuestRxFilters;
> > +
> > + return port;
> > +
> > + error:
> > + virNetworkPortDefFree(port);
> > + return NULL;
> > +}
> > +
> > +int
> > +virDomainNetDefActualFromNetworkPort(virDomainNetDefPtr iface,
> > + virNetworkPortDefPtr port)
> > +{
> > + virDomainActualNetDefPtr actual = NULL;
> > +
> > + if (iface->type != VIR_DOMAIN_NET_TYPE_NETWORK) {
> > + virReportError(VIR_ERR_INTERNAL_ERROR,
> > + _("Expected an interface of type 'network' not '%s'"),
> > + virDomainNetTypeToString(iface->type));
> > + return -1;
> > + }
> > +
> > + if (VIR_ALLOC(actual) < 0)
> > + return -1;
> > +
> > + switch ((virNetworkPortPlugType)port->plugtype) {
> > + case VIR_NETWORK_PORT_PLUG_TYPE_NONE:
> > + break;
> > +
> > + case VIR_NETWORK_PORT_PLUG_TYPE_BRIDGE:
> > + if (VIR_STRDUP(actual->data.bridge.brname,
> > + port->plug.bridge.brname) < 0)
> > + goto error;
> > + actual->data.bridge.macTableManager = port->plug.bridge.macTableManager;
> > + break;
>
>
> none of the cases set actual->type.
>
>
> > +
> > + case VIR_NETWORK_PORT_PLUG_TYPE_DIRECT:
> > + if (VIR_STRDUP(actual->data.direct.linkdev,
> > + port->plug.direct.linkdev) < 0)
> > + goto error;
> > + actual->data.direct.mode = port->plug.direct.mode;
> > + break;
> > +
> > + case VIR_NETWORK_PORT_PLUG_TYPE_HOSTDEV_PCI:
> > + actual->data.hostdev.def.parent = iface;
> > + actual->data.hostdev.def.info = &iface->info;
>
>
> Again, it would be simpler to verify if the assignments were in the same
> order as the attributes are in the definition of virDomainHostdevDef. (It
> appears there are some that aren't being set (startupPolicy, missing,
> readonly, shareable, origStates), but that's just because they're never used
> in this context anyway, (as proven by the fact that they don't have a
> counterpart in virNetworkPort.
>
>
> > + actual->data.hostdev.def.mode = VIR_DOMAIN_HOSTDEV_MODE_SUBSYS;
> > + actual->data.hostdev.def.managed = port->plug.hostdevpci.managed;
> > + actual->data.hostdev.def.source.subsys.type = VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI;
> > + actual->data.hostdev.def.source.subsys.u.pci.addr = port->plug.hostdevpci.addr;
> > + switch ((virNetworkForwardDriverNameType)port->plug.hostdevpci.driver) {
> > + case VIR_NETWORK_FORWARD_DRIVER_NAME_DEFAULT:
> > + actual->data.hostdev.def.source.subsys.u.pci.backend =
> > + VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT;
> > + break;
> > +
> > + case VIR_NETWORK_FORWARD_DRIVER_NAME_KVM:
> > + actual->data.hostdev.def.source.subsys.u.pci.backend =
> > + VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM;
> > + break;
>
>
> Sigh. More legacy KVM pci device assignment stuff.
>
>
> > +
> > + case VIR_NETWORK_FORWARD_DRIVER_NAME_VFIO:
> > + actual->data.hostdev.def.source.subsys.u.pci.backend =
> > + VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO;
> > + break;
> > +
> > + case VIR_NETWORK_FORWARD_DRIVER_NAME_LAST:
> > + default:
> > + virReportEnumRangeError(virNetworkForwardDriverNameType,
> > + port->plug.hostdevpci.driver);
> > + goto error;
> > + }
> > +
> > + break;
> > +
> > + case VIR_NETWORK_PORT_PLUG_TYPE_LAST:
> > + default:
> > + virReportEnumRangeError(virNetworkPortPlugType, port->plugtype);
> > + goto error;
> > + }
> > +
> > + if (virNetDevVPortProfileCopy(&actual->virtPortProfile, port->virtPortProfile) < 0)
> > + goto error;
> > +
> > + if (virNetDevBandwidthCopy(&actual->bandwidth, port->bandwidth) < 0)
> > + goto error;
> > +
> > + if (virNetDevVlanCopy(&actual->vlan, &port->vlan) < 0)
> > + goto error;
> > +
> > + actual->class_id = port->class_id;
> > + actual->trustGuestRxFilters = port->trustGuestRxFilters;
> > +
> > + virDomainActualNetDefFree(iface->data.network.actual);
> > + iface->data.network.actual = actual;
> > +
> > + return 0;
> > +
> > + error:
> > + virDomainActualNetDefFree(actual);
> > + return -1;
> > +}
> > +
> > +virNetworkPortDefPtr
> > +virDomainNetDefActualToNetworkPort(virDomainDefPtr dom,
> > + virDomainNetDefPtr iface)
> > +{
> > + virDomainActualNetDefPtr actual;
> > + virNetworkPortDefPtr port;
> > +
> > + if (!iface->data.network.actual) {
> > + virReportError(VIR_ERR_INTERNAL_ERROR,
> > + _("Missing actual data for interface '%s'"),
> > + iface->ifname);
> > + return NULL;
> > + }
> > +
> > + actual = iface->data.network.actual;
> > +
> > + if (iface->type != VIR_DOMAIN_NET_TYPE_NETWORK) {
> > + virReportError(VIR_ERR_INTERNAL_ERROR,
> > + _("Expected an interface of type 'network' not '%s'"),
> > + virDomainNetTypeToString(iface->type));
> > + return NULL;
> > + }
> > +
> > + if (VIR_ALLOC(port) < 0)
> > + return NULL;
> > +
> > + /* Bad - we need to preserve original port uuid */
>
>
> So is this acceptable as-is because of the limited ways you end up using
> virDomainNetDefActualToNetworkPort()? Or is it something that needs to be
> fixed?
Hm, I swear I fixed that, but perhapos I've mistakenly squashed into
a later patch in this series.
Regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
More information about the libvir-list
mailing list