[libvirt] [PATCH v3 25/36] network: introduce networkReleasePort

Daniel P. Berrangé posted 36 patches 6 years, 10 months ago
There is a newer version of this series
[libvirt] [PATCH v3 25/36] network: introduce networkReleasePort
Posted by Daniel P. Berrangé 6 years, 10 months ago
Separate network port deletion code from the domain driver network
callback implementation.

Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
---
 src/network/bridge_driver.c | 91 ++++++++++++++++++++++++-------------
 1 file changed, 59 insertions(+), 32 deletions(-)

diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
index d953215315..3c2fcd16e5 100644
--- a/src/network/bridge_driver.c
+++ b/src/network/bridge_driver.c
@@ -4930,9 +4930,9 @@ networkNotifyActualDevice(virNetworkPtr net,
 }
 
 
-/* networkReleaseActualDevice:
- * @dom: domain definition that @iface belongs to
- * @iface:  a domain's NetDef (interface definition)
+/* networkReleasePort:
+ * @obj: the network to release from
+ * @port: the port definition to release
  *
  * Given a domain <interface> element that previously had its <actual>
  * element filled in (and possibly a physical device allocated to it),
@@ -4942,40 +4942,15 @@ networkNotifyActualDevice(virNetworkPtr net,
  * Returns 0 on success, -1 on failure.
  */
 static int
-networkReleaseActualDevice(virNetworkPtr net,
-                           virDomainDefPtr dom,
-                           virDomainNetDefPtr iface)
+networkReleasePort(virNetworkObjPtr obj,
+                   virNetworkPortDefPtr port)
 {
     virNetworkDriverStatePtr driver = networkGetDriver();
-    virNetworkObjPtr obj;
     virNetworkDefPtr netdef;
     virNetworkForwardIfDefPtr dev = NULL;
-    virNetworkPortDefPtr port = NULL;
     size_t i;
     int ret = -1;
 
-    obj = virNetworkObjFindByName(driver->networks, net->name);
-    if (!obj) {
-        virReportError(VIR_ERR_NO_NETWORK,
-                       _("no network with matching name '%s'"),
-                       net->name);
-        goto cleanup;
-    }
-
-    if (iface->type != VIR_DOMAIN_NET_TYPE_NETWORK) {
-        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                       _("Expected a interface for a virtual network"));
-        goto cleanup;
-    }
-
-    if (iface->data.network.actual == NULL) {
-        ret = 0;
-        goto cleanup;
-    }
-
-    if (!(port = virDomainNetDefActualToNetworkPort(dom, iface)))
-        goto cleanup;
-
     netdef = virNetworkObjGetDef(obj);
 
     switch ((virNetworkPortPlugType)port->plugtype) {
@@ -5054,7 +5029,7 @@ networkReleaseActualDevice(virNetworkPtr net,
         goto cleanup;
     }
 
-    virNetworkObjMacMgrDel(obj, driver->dnsmasqStateDir, dom->name, &iface->mac);
+    virNetworkObjMacMgrDel(obj, driver->dnsmasqStateDir, port->ownername, &port->mac);
 
     netdef->connections--;
     if (dev)
@@ -5062,7 +5037,59 @@ networkReleaseActualDevice(virNetworkPtr net,
     /* finally we can call the 'unplugged' hook script if any */
     networkRunHook(obj, port, VIR_HOOK_NETWORK_OP_PORT_DELETED,
                    VIR_HOOK_SUBOP_BEGIN);
-    networkLogAllocation(netdef, dev, &iface->mac, false);
+    networkLogAllocation(netdef, dev, &port->mac, false);
+
+    ret = 0;
+ cleanup:
+    return ret;
+}
+
+
+/* networkReleaseActualDevice:
+ * @dom: domain definition that @iface belongs to
+ * @iface:  a domain's NetDef (interface definition)
+ *
+ * Given a domain <interface> element that previously had its <actual>
+ * element filled in (and possibly a physical device allocated to it),
+ * free up the physical device for use by someone else, and free the
+ * virDomainActualNetDef.
+ *
+ * Returns 0 on success, -1 on failure.
+ */
+static int
+networkReleaseActualDevice(virNetworkPtr net,
+                           virDomainDefPtr dom,
+                           virDomainNetDefPtr iface)
+{
+    virNetworkDriverStatePtr driver = networkGetDriver();
+    virNetworkObjPtr obj;
+    virNetworkPortDefPtr port = NULL;
+    int ret = -1;
+
+    obj = virNetworkObjFindByName(driver->networks, net->name);
+    if (!obj) {
+        virReportError(VIR_ERR_NO_NETWORK,
+                       _("no network with matching name '%s'"),
+                       net->name);
+        goto cleanup;
+    }
+
+    if (iface->type != VIR_DOMAIN_NET_TYPE_NETWORK) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                       _("Expected a interface for a virtual network"));
+        goto cleanup;
+    }
+
+    if (iface->data.network.actual == NULL) {
+        ret = 0;
+        goto cleanup;
+    }
+
+    if (!(port = virDomainNetDefActualToNetworkPort(dom, iface)))
+        goto cleanup;
+
+    if (networkReleasePort(obj, port) < 0)
+        goto cleanup;
 
     ret = 0;
  cleanup:
-- 
2.20.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH v3 25/36] network: introduce networkReleasePort
Posted by Laine Stump 6 years, 10 months ago
On 3/19/19 8:46 AM, Daniel P. Berrangé wrote:
> Separate network port deletion code from the domain driver network
> callback implementation.
>
> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> ---
>   src/network/bridge_driver.c | 91 ++++++++++++++++++++++++-------------
>   1 file changed, 59 insertions(+), 32 deletions(-)
>
> diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
> index d953215315..3c2fcd16e5 100644
> --- a/src/network/bridge_driver.c
> +++ b/src/network/bridge_driver.c
> @@ -4930,9 +4930,9 @@ networkNotifyActualDevice(virNetworkPtr net,
>   }
>   
>   
> -/* networkReleaseActualDevice:
> - * @dom: domain definition that @iface belongs to
> - * @iface:  a domain's NetDef (interface definition)
> +/* networkReleasePort:
> + * @obj: the network to release from
> + * @port: the port definition to release
>    *
>    * Given a domain <interface> element that previously had its <actual>
>    * element filled in (and possibly a physical device allocated to it),
> @@ -4942,40 +4942,15 @@ networkNotifyActualDevice(virNetworkPtr net,
>    * Returns 0 on success, -1 on failure.
>    */
>   static int
> -networkReleaseActualDevice(virNetworkPtr net,
> -                           virDomainDefPtr dom,
> -                           virDomainNetDefPtr iface)
> +networkReleasePort(virNetworkObjPtr obj,
> +                   virNetworkPortDefPtr port)
>   {
>       virNetworkDriverStatePtr driver = networkGetDriver();
> -    virNetworkObjPtr obj;
>       virNetworkDefPtr netdef;
>       virNetworkForwardIfDefPtr dev = NULL;
> -    virNetworkPortDefPtr port = NULL;
>       size_t i;
>       int ret = -1;
>   
> -    obj = virNetworkObjFindByName(driver->networks, net->name);
> -    if (!obj) {
> -        virReportError(VIR_ERR_NO_NETWORK,
> -                       _("no network with matching name '%s'"),
> -                       net->name);
> -        goto cleanup;
> -    }
> -
> -    if (iface->type != VIR_DOMAIN_NET_TYPE_NETWORK) {
> -        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> -                       _("Expected a interface for a virtual network"));
> -        goto cleanup;
> -    }
> -
> -    if (iface->data.network.actual == NULL) {
> -        ret = 0;
> -        goto cleanup;
> -    }
> -
> -    if (!(port = virDomainNetDefActualToNetworkPort(dom, iface)))
> -        goto cleanup;
> -
>       netdef = virNetworkObjGetDef(obj);
>   
>       switch ((virNetworkPortPlugType)port->plugtype) {
> @@ -5054,7 +5029,7 @@ networkReleaseActualDevice(virNetworkPtr net,
>           goto cleanup;
>       }
>   
> -    virNetworkObjMacMgrDel(obj, driver->dnsmasqStateDir, dom->name, &iface->mac);
> +    virNetworkObjMacMgrDel(obj, driver->dnsmasqStateDir, port->ownername, &port->mac);
>   
>       netdef->connections--;
>       if (dev)
> @@ -5062,7 +5037,59 @@ networkReleaseActualDevice(virNetworkPtr net,
>       /* finally we can call the 'unplugged' hook script if any */
>       networkRunHook(obj, port, VIR_HOOK_NETWORK_OP_PORT_DELETED,
>                      VIR_HOOK_SUBOP_BEGIN);
> -    networkLogAllocation(netdef, dev, &iface->mac, false);
> +    networkLogAllocation(netdef, dev, &port->mac, false);
> +
> +    ret = 0;
> + cleanup:
> +    return ret;
> +}
> +
> +
> +/* networkReleaseActualDevice:
> + * @dom: domain definition that @iface belongs to
> + * @iface:  a domain's NetDef (interface definition)
> + *
> + * Given a domain <interface> element that previously had its <actual>
> + * element filled in (and possibly a physical device allocated to it),
> + * free up the physical device for use by someone else, and free the
> + * virDomainActualNetDef.
> + *
> + * Returns 0 on success, -1 on failure.
> + */
> +static int
> +networkReleaseActualDevice(virNetworkPtr net,
> +                           virDomainDefPtr dom,
> +                           virDomainNetDefPtr iface)
> +{
> +    virNetworkDriverStatePtr driver = networkGetDriver();
> +    virNetworkObjPtr obj;
> +    virNetworkPortDefPtr port = NULL;
> +    int ret = -1;
> +
> +    obj = virNetworkObjFindByName(driver->networks, net->name);
> +    if (!obj) {
> +        virReportError(VIR_ERR_NO_NETWORK,
> +                       _("no network with matching name '%s'"),
> +                       net->name);
> +        goto cleanup;
> +    }
> +
> +    if (iface->type != VIR_DOMAIN_NET_TYPE_NETWORK) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                       _("Expected a interface for a virtual network"));


s/a interface/an interface/  (yeah, I know you're just moving existing 
bad grammar, but may as well fix it now)


> +        goto cleanup;
> +    }
> +
> +    if (iface->data.network.actual == NULL) {
> +        ret = 0;
> +        goto cleanup;
> +    }
> +
> +    if (!(port = virDomainNetDefActualToNetworkPort(dom, iface)))
> +        goto cleanup;
> +
> +    if (networkReleasePort(obj, port) < 0)
> +        goto cleanup;
>   
>       ret = 0;
>    cleanup:


Reivewed-by: Laine Stump <laine@laine.org>


--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH v3 25/36] network: introduce networkReleasePort
Posted by Daniel P. Berrangé 6 years, 10 months ago
On Tue, Apr 02, 2019 at 09:53:57PM -0400, Laine Stump wrote:
> On 3/19/19 8:46 AM, Daniel P. Berrangé wrote:
> > Separate network port deletion code from the domain driver network
> > callback implementation.
> > 
> > Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> > ---
> >   src/network/bridge_driver.c | 91 ++++++++++++++++++++++++-------------
> >   1 file changed, 59 insertions(+), 32 deletions(-)

> > +static int
> > +networkReleaseActualDevice(virNetworkPtr net,
> > +                           virDomainDefPtr dom,
> > +                           virDomainNetDefPtr iface)
> > +{
> > +    virNetworkDriverStatePtr driver = networkGetDriver();
> > +    virNetworkObjPtr obj;
> > +    virNetworkPortDefPtr port = NULL;
> > +    int ret = -1;
> > +
> > +    obj = virNetworkObjFindByName(driver->networks, net->name);
> > +    if (!obj) {
> > +        virReportError(VIR_ERR_NO_NETWORK,
> > +                       _("no network with matching name '%s'"),
> > +                       net->name);
> > +        goto cleanup;
> > +    }
> > +
> > +    if (iface->type != VIR_DOMAIN_NET_TYPE_NETWORK) {
> > +        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> > +                       _("Expected a interface for a virtual network"));
> 
> 
> s/a interface/an interface/  (yeah, I know you're just moving existing bad
> grammar, but may as well fix it now)

This got fixed already as its just code movement from earlier patch
where you already pointed it out.

> 
> 
> > +        goto cleanup;
> > +    }
> > +
> > +    if (iface->data.network.actual == NULL) {
> > +        ret = 0;
> > +        goto cleanup;
> > +    }
> > +
> > +    if (!(port = virDomainNetDefActualToNetworkPort(dom, iface)))
> > +        goto cleanup;
> > +
> > +    if (networkReleasePort(obj, port) < 0)
> > +        goto cleanup;
> >       ret = 0;
> >    cleanup:
> 
> 
> Reivewed-by: Laine Stump <laine@laine.org>
> 
> 

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 :|

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list