[libvirt] [PATCH v2 20/21] nwfilter: wire up new APIs for creating and deleting nwfilter bindings

Daniel P. Berrangé posted 21 patches 6 years, 12 months ago
There is a newer version of this series
[libvirt] [PATCH v2 20/21] nwfilter: wire up new APIs for creating and deleting nwfilter bindings
Posted by Daniel P. Berrangé 6 years, 12 months ago
This allows the virsh commands nwfilter-binding-create and
nwfilter-binding-delete to be used.

Note using these commands lets you delete filters that were
previously created automatically by the virt drivers, or add
filters for VM nics that were not there before. Generally it
is expected these new APIs will only be used by virt drivers.
It is the admin's responsibility to not shoot themselves in
the foot.

Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
---
 src/nwfilter/nwfilter_driver.c | 77 ++++++++++++++++++++++++++++++++++
 1 file changed, 77 insertions(+)

diff --git a/src/nwfilter/nwfilter_driver.c b/src/nwfilter/nwfilter_driver.c
index 6544261b38..c3c52ae5f3 100644
--- a/src/nwfilter/nwfilter_driver.c
+++ b/src/nwfilter/nwfilter_driver.c
@@ -782,6 +782,81 @@ nwfilterBindingGetXMLDesc(virNWFilterBindingPtr binding,
 }
 
 
+static virNWFilterBindingPtr
+nwfilterBindingCreateXML(virConnectPtr conn,
+                         const char *xml,
+                         unsigned int flags)
+{
+    virNWFilterBindingObjPtr obj;
+    virNWFilterBindingDefPtr def;
+    virNWFilterBindingPtr ret = NULL;
+
+    virCheckFlags(0, NULL);
+
+    def = virNWFilterBindingDefParseString(xml);
+    if (!def)
+        return NULL;
+
+    if (virNWFilterBindingCreateXMLEnsureACL(conn, def) < 0)
+        goto cleanup;
+
+    obj = virNWFilterBindingObjListFindByPortDev(driver->bindings, def->portdevname);
+    if (obj) {
+        virReportError(VIR_ERR_INTERNAL_ERROR,
+                       _("Filter already present for NIC %s"), def->portdevname);
+        goto cleanup;
+    }
+
+    obj = virNWFilterBindingObjListAdd(driver->bindings,
+                                       def);
+    if (!obj)
+        goto cleanup;
+    def = NULL;
+
+    if (!(ret = virGetNWFilterBinding(conn, obj->def->portdevname, obj->def->filter)))
+        goto cleanup;
+
+    if (virNWFilterInstantiateFilter(driver, obj->def) < 0) {
+        virNWFilterBindingObjListRemove(driver->bindings, obj);
+        virObjectUnref(ret);
+        ret = NULL;
+        goto cleanup;
+    }
+    virNWFilterBindingObjSave(obj, driver->bindingDir);
+
+ cleanup:
+    virNWFilterBindingDefFree(def);
+    virNWFilterBindingObjEndAPI(&obj);
+
+    return ret;
+}
+
+
+static int
+nwfilterBindingDelete(virNWFilterBindingPtr binding)
+{
+    virNWFilterBindingObjPtr obj;
+    int ret = -1;
+
+    obj = virNWFilterBindingObjListFindByPortDev(driver->bindings, binding->portdev);
+    if (!obj)
+        return -1;
+
+    if (virNWFilterBindingDeleteEnsureACL(binding->conn, obj->def) < 0)
+        goto cleanup;
+
+    virNWFilterTeardownFilter(obj->def);
+    virNWFilterBindingObjDelete(obj, driver->bindingDir);
+    virNWFilterBindingObjListRemove(driver->bindings, obj);
+
+    ret = 0;
+
+ cleanup:
+    virNWFilterBindingObjEndAPI(&obj);
+    return ret;
+}
+
+
 static virNWFilterDriver nwfilterDriver = {
     .name = "nwfilter",
     .connectNumOfNWFilters = nwfilterConnectNumOfNWFilters, /* 0.8.0 */
@@ -795,6 +870,8 @@ static virNWFilterDriver nwfilterDriver = {
     .nwfilterBindingLookupByPortDev = nwfilterBindingLookupByPortDev, /* 4.4.0 */
     .connectListAllNWFilterBindings = nwfilterConnectListAllNWFilterBindings, /* 4.4.0 */
     .nwfilterBindingGetXMLDesc = nwfilterBindingGetXMLDesc, /* 4.4.0 */
+    .nwfilterBindingCreateXML = nwfilterBindingCreateXML, /* 4.4.0 */
+    .nwfilterBindingDelete = nwfilterBindingDelete, /* 4.4.0 */
 };
 
 
-- 
2.17.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH v2 20/21] nwfilter: wire up new APIs for creating and deleting nwfilter bindings
Posted by John Ferlan 6 years, 12 months ago

On 05/15/2018 01:43 PM, Daniel P. Berrangé wrote:
> This allows the virsh commands nwfilter-binding-create and
> nwfilter-binding-delete to be used.
> 
> Note using these commands lets you delete filters that were
> previously created automatically by the virt drivers, or add
> filters for VM nics that were not there before. Generally it
> is expected these new APIs will only be used by virt drivers.
> It is the admin's responsibility to not shoot themselves in
> the foot.
> 
> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> ---
>  src/nwfilter/nwfilter_driver.c | 77 ++++++++++++++++++++++++++++++++++
>  1 file changed, 77 insertions(+)
> 
> diff --git a/src/nwfilter/nwfilter_driver.c b/src/nwfilter/nwfilter_driver.c
> index 6544261b38..c3c52ae5f3 100644
> --- a/src/nwfilter/nwfilter_driver.c
> +++ b/src/nwfilter/nwfilter_driver.c
> @@ -782,6 +782,81 @@ nwfilterBindingGetXMLDesc(virNWFilterBindingPtr binding,
>  }
>  
>  
> +static virNWFilterBindingPtr
> +nwfilterBindingCreateXML(virConnectPtr conn,
> +                         const char *xml,
> +                         unsigned int flags)
> +{
> +    virNWFilterBindingObjPtr obj;
> +    virNWFilterBindingDefPtr def;
> +    virNWFilterBindingPtr ret = NULL;
> +
> +    virCheckFlags(0, NULL);
> +
> +    def = virNWFilterBindingDefParseString(xml);
> +    if (!def)
> +        return NULL;
> +
> +    if (virNWFilterBindingCreateXMLEnsureACL(conn, def) < 0)
> +        goto cleanup;
> +
> +    obj = virNWFilterBindingObjListFindByPortDev(driver->bindings, def->portdevname);
> +    if (obj) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR,
> +                       _("Filter already present for NIC %s"), def->portdevname);
> +        goto cleanup;
> +    }
> +
> +    obj = virNWFilterBindingObjListAdd(driver->bindings,
> +                                       def);
> +    if (!obj)
> +        goto cleanup;
> +    def = NULL;

Use an accessor and assign to a new @objdef, and then use instead of
obj->def

> +
> +    if (!(ret = virGetNWFilterBinding(conn, obj->def->portdevname, obj->def->filter)))
> +        goto cleanup;
> +
> +    if (virNWFilterInstantiateFilter(driver, obj->def) < 0) {
> +        virNWFilterBindingObjListRemove(driver->bindings, obj);
> +        virObjectUnref(ret);
> +        ret = NULL;
> +        goto cleanup;
> +    }
> +    virNWFilterBindingObjSave(obj, driver->bindingDir);
> +
> + cleanup:
> +    virNWFilterBindingDefFree(def);
> +    virNWFilterBindingObjEndAPI(&obj);
> +
> +    return ret;
> +}
> +
> +
> +static int
> +nwfilterBindingDelete(virNWFilterBindingPtr binding)
> +{
> +    virNWFilterBindingObjPtr obj;
> +    int ret = -1;
> +
> +    obj = virNWFilterBindingObjListFindByPortDev(driver->bindings, binding->portdev);
> +    if (!obj)
> +        return -1;

Probably should message here that we couldn't find an object for the
binding->portdev since virNWFilterBindingObjListFindByPortDev doesn't
message anything.

And of course usage of an accessor for obj->def

For the logic,

Reviewed-by: John Ferlan <jferlan@redhat.com>

John

> +
> +    if (virNWFilterBindingDeleteEnsureACL(binding->conn, obj->def) < 0)
> +        goto cleanup;
> +
> +    virNWFilterTeardownFilter(obj->def);
> +    virNWFilterBindingObjDelete(obj, driver->bindingDir);
> +    virNWFilterBindingObjListRemove(driver->bindings, obj);
> +
> +    ret = 0;
> +
> + cleanup:
> +    virNWFilterBindingObjEndAPI(&obj);
> +    return ret;
> +}
> +
> +
>  static virNWFilterDriver nwfilterDriver = {
>      .name = "nwfilter",
>      .connectNumOfNWFilters = nwfilterConnectNumOfNWFilters, /* 0.8.0 */
> @@ -795,6 +870,8 @@ static virNWFilterDriver nwfilterDriver = {
>      .nwfilterBindingLookupByPortDev = nwfilterBindingLookupByPortDev, /* 4.4.0 */
>      .connectListAllNWFilterBindings = nwfilterConnectListAllNWFilterBindings, /* 4.4.0 */
>      .nwfilterBindingGetXMLDesc = nwfilterBindingGetXMLDesc, /* 4.4.0 */
> +    .nwfilterBindingCreateXML = nwfilterBindingCreateXML, /* 4.4.0 */
> +    .nwfilterBindingDelete = nwfilterBindingDelete, /* 4.4.0 */
>  };
>  
>  
> 

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