[libvirt] [PATCH 10/16] network: Introduce virNetworkObj{Get|Set}Autostart

John Ferlan posted 16 patches 8 years, 6 months ago
There is a newer version of this series
[libvirt] [PATCH 10/16] network: Introduce virNetworkObj{Get|Set}Autostart
Posted by John Ferlan 8 years, 6 months ago
In preparation for privatizing the virNetworkObj structure, move the guts
of the Get/Set Autostart from the driver into virnetworkobj. Alter the driver
to make the calls to the networkobj code.

Signed-off-by: John Ferlan <jferlan@redhat.com>
---
 src/conf/virnetworkobj.c    | 74 +++++++++++++++++++++++++++++++++++++++++++++
 src/conf/virnetworkobj.h    | 11 ++++++-
 src/libvirt_private.syms    |  2 ++
 src/network/bridge_driver.c | 53 ++++----------------------------
 src/test/test_driver.c      |  6 ++--
 5 files changed, 96 insertions(+), 50 deletions(-)

diff --git a/src/conf/virnetworkobj.c b/src/conf/virnetworkobj.c
index 488fffd..a21aa26 100644
--- a/src/conf/virnetworkobj.c
+++ b/src/conf/virnetworkobj.c
@@ -121,6 +121,80 @@ virNetworkObjGetNewDef(virNetworkObjPtr obj)
 }
 
 
+int
+virNetworkObjGetAutostart(virNetworkObjPtr obj)
+{
+    return obj->autostart;
+}
+
+
+int
+virNetworkObjSetAutostart(virNetworkObjPtr obj,
+                          const char *configDir,
+                          const char *autostartDir,
+                          int autostart)
+{
+    virNetworkDefPtr def = obj->def;
+    char *configFile = NULL;
+    char *autostartLink = NULL;
+    int ret = -1;
+
+    if (!obj->persistent) {
+        virReportError(VIR_ERR_OPERATION_INVALID,
+                       _("cannot set autostart for transient network '%s'"),
+                       def->name);
+        return -1;
+    }
+
+    autostart = (autostart != 0);
+
+    if (obj->autostart != autostart) {
+        if (configDir && autostartDir) {
+            if (!(configFile = virNetworkConfigFile(configDir, def->name)))
+                goto cleanup;
+
+            if (!(autostartLink = virNetworkConfigFile(autostartDir,
+                                                       def->name)))
+                goto cleanup;
+
+            if (autostart) {
+                if (virFileMakePath(autostartDir) < 0) {
+                    virReportSystemError(errno,
+                                         _("cannot create autostart dir '%s'"),
+                                         autostartDir);
+                    goto cleanup;
+                }
+
+                if (symlink(configFile, autostartLink) < 0) {
+                    virReportSystemError(errno,
+                                         _("failed to create symlink '%s' "
+                                           "to '%s'"),
+                                         autostartLink, configFile);
+                    goto cleanup;
+                }
+            } else {
+                if (unlink(autostartLink) < 0 &&
+                    errno != ENOENT && errno != ENOTDIR) {
+                    virReportSystemError(errno,
+                                         _("failed to delete symlink '%s'"),
+                                         autostartLink);
+                    goto cleanup;
+                }
+            }
+        }
+
+        obj->autostart = autostart;
+    }
+
+    ret = 0;
+
+ cleanup:
+    VIR_FREE(configFile);
+    VIR_FREE(autostartLink);
+    return ret;
+}
+
+
 pid_t
 virNetworkObjGetDnsmasqPid(virNetworkObjPtr obj)
 {
diff --git a/src/conf/virnetworkobj.h b/src/conf/virnetworkobj.h
index 4b7c982..55a5331 100644
--- a/src/conf/virnetworkobj.h
+++ b/src/conf/virnetworkobj.h
@@ -32,7 +32,7 @@ struct _virNetworkObj {
     pid_t dnsmasqPid;
     pid_t radvdPid;
     unsigned int active : 1;
-    unsigned int autostart : 1;
+    int autostart;
     unsigned int persistent : 1;
 
     virNetworkDefPtr def; /* The current definition */
@@ -56,6 +56,15 @@ virNetworkObjGetDef(virNetworkObjPtr obj);
 virNetworkDefPtr
 virNetworkObjGetNewDef(virNetworkObjPtr obj);
 
+int
+virNetworkObjGetAutostart(virNetworkObjPtr obj);
+
+int
+virNetworkObjSetAutostart(virNetworkObjPtr obj,
+                          const char *configDir,
+                          const char *autostartDir,
+                          int autostart);
+
 virMacMapPtr
 virNetworkObjGetMacMap(virNetworkObjPtr obj);
 
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 6b4c37c..b148eeb 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -931,6 +931,7 @@ virNetworkObjFindByName;
 virNetworkObjFindByNameLocked;
 virNetworkObjFindByUUID;
 virNetworkObjFindByUUIDLocked;
+virNetworkObjGetAutostart;
 virNetworkObjGetClassIdMap;
 virNetworkObjGetDef;
 virNetworkObjGetDnsmasqPid;
@@ -954,6 +955,7 @@ virNetworkObjNew;
 virNetworkObjRemoveInactive;
 virNetworkObjReplacePersistentDef;
 virNetworkObjSaveStatus;
+virNetworkObjSetAutostart;
 virNetworkObjSetDefTransient;
 virNetworkObjSetDnsmasqPid;
 virNetworkObjSetFloorSum;
diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
index f8e11e2..029f1b5 100644
--- a/src/network/bridge_driver.c
+++ b/src/network/bridge_driver.c
@@ -525,7 +525,7 @@ networkAutostartConfig(virNetworkObjPtr obj,
     int ret = -1;
 
     virObjectLock(obj);
-    if (obj->autostart &&
+    if (virNetworkObjGetAutostart(obj) &&
         !virNetworkObjIsActive(obj) &&
         networkStartNetwork(driver, obj) < 0)
         goto cleanup;
@@ -3963,7 +3963,7 @@ networkGetAutostart(virNetworkPtr net,
     if (virNetworkGetAutostartEnsureACL(net->conn, virNetworkObjGetDef(obj)) < 0)
         goto cleanup;
 
-    *autostart = obj->autostart;
+    *autostart = virNetworkObjGetAutostart(obj);
     ret = 0;
 
  cleanup:
@@ -3978,63 +3978,22 @@ networkSetAutostart(virNetworkPtr net,
 {
     virNetworkDriverStatePtr driver = networkGetDriver();
     virNetworkObjPtr obj;
-    virNetworkDefPtr def;
-    char *configFile = NULL, *autostartLink = NULL;
     int ret = -1;
 
     if (!(obj = networkObjFromNetwork(net)))
         goto cleanup;
-    def = virNetworkObjGetDef(obj);
 
-    if (virNetworkSetAutostartEnsureACL(net->conn, def) < 0)
+    if (virNetworkSetAutostartEnsureACL(net->conn,
+                                        virNetworkObjGetDef(obj)) < 0)
         goto cleanup;
 
-    if (!obj->persistent) {
-        virReportError(VIR_ERR_OPERATION_INVALID,
-                       "%s", _("cannot set autostart for transient network"));
+    if (virNetworkObjSetAutostart(obj, driver->networkConfigDir,
+                                  driver->networkAutostartDir, autostart) < 0)
         goto cleanup;
-    }
-
-    autostart = (autostart != 0);
 
-    if (obj->autostart != autostart) {
-        if ((configFile = virNetworkConfigFile(driver->networkConfigDir,
-                                               def->name)) == NULL)
-            goto cleanup;
-        if ((autostartLink = virNetworkConfigFile(driver->networkAutostartDir,
-                                                  def->name)) == NULL)
-            goto cleanup;
-
-        if (autostart) {
-            if (virFileMakePath(driver->networkAutostartDir) < 0) {
-                virReportSystemError(errno,
-                                     _("cannot create autostart directory '%s'"),
-                                     driver->networkAutostartDir);
-                goto cleanup;
-            }
-
-            if (symlink(configFile, autostartLink) < 0) {
-                virReportSystemError(errno,
-                                     _("Failed to create symlink '%s' to '%s'"),
-                                     autostartLink, configFile);
-                goto cleanup;
-            }
-        } else {
-            if (unlink(autostartLink) < 0 && errno != ENOENT && errno != ENOTDIR) {
-                virReportSystemError(errno,
-                                     _("Failed to delete symlink '%s'"),
-                                     autostartLink);
-                goto cleanup;
-            }
-        }
-
-        obj->autostart = autostart;
-    }
     ret = 0;
 
  cleanup:
-    VIR_FREE(configFile);
-    VIR_FREE(autostartLink);
     virNetworkObjEndAPI(&obj);
     return ret;
 }
diff --git a/src/test/test_driver.c b/src/test/test_driver.c
index ee473ba..e14fc63 100644
--- a/src/test/test_driver.c
+++ b/src/test/test_driver.c
@@ -3644,7 +3644,7 @@ testNetworkGetAutostart(virNetworkPtr net,
     if (!(obj = testNetworkObjFindByName(privconn, net->name)))
         goto cleanup;
 
-    *autostart = obj->autostart;
+    *autostart = virNetworkObjGetAutostart(obj);
     ret = 0;
 
  cleanup:
@@ -3664,7 +3664,9 @@ testNetworkSetAutostart(virNetworkPtr net,
     if (!(obj = testNetworkObjFindByName(privconn, net->name)))
         goto cleanup;
 
-    obj->autostart = autostart ? 1 : 0;
+    if (virNetworkObjSetAutostart(obj, NULL, NULL, autostart) < 0)
+        goto cleanup;
+
     ret = 0;
 
  cleanup:
-- 
2.9.3

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH 10/16] network: Introduce virNetworkObj{Get|Set}Autostart
Posted by Pavel Hrdina 8 years, 4 months ago
On Fri, May 19, 2017 at 09:03:18AM -0400, John Ferlan wrote:
> In preparation for privatizing the virNetworkObj structure, move the guts
> of the Get/Set Autostart from the driver into virnetworkobj. Alter the driver
> to make the calls to the networkobj code.
> 
> Signed-off-by: John Ferlan <jferlan@redhat.com>
> ---
>  src/conf/virnetworkobj.c    | 74 +++++++++++++++++++++++++++++++++++++++++++++
>  src/conf/virnetworkobj.h    | 11 ++++++-
>  src/libvirt_private.syms    |  2 ++
>  src/network/bridge_driver.c | 53 ++++----------------------------
>  src/test/test_driver.c      |  6 ++--
>  5 files changed, 96 insertions(+), 50 deletions(-)
> 
> diff --git a/src/conf/virnetworkobj.c b/src/conf/virnetworkobj.c
> index 488fffd..a21aa26 100644
> --- a/src/conf/virnetworkobj.c
> +++ b/src/conf/virnetworkobj.c
> @@ -121,6 +121,80 @@ virNetworkObjGetNewDef(virNetworkObjPtr obj)
>  }
>  
>  
> +int
> +virNetworkObjGetAutostart(virNetworkObjPtr obj)
> +{
> +    return obj->autostart;
> +}
> +
> +
> +int
> +virNetworkObjSetAutostart(virNetworkObjPtr obj,
> +                          const char *configDir,
> +                          const char *autostartDir,
> +                          int autostart)
> +{
> +    virNetworkDefPtr def = obj->def;
> +    char *configFile = NULL;
> +    char *autostartLink = NULL;
> +    int ret = -1;
> +
> +    if (!obj->persistent) {
> +        virReportError(VIR_ERR_OPERATION_INVALID,
> +                       _("cannot set autostart for transient network '%s'"),
> +                       def->name);
> +        return -1;
> +    }
> +
> +    autostart = (autostart != 0);
> +
> +    if (obj->autostart != autostart) {
> +        if (configDir && autostartDir) {
> +            if (!(configFile = virNetworkConfigFile(configDir, def->name)))
> +                goto cleanup;
> +
> +            if (!(autostartLink = virNetworkConfigFile(autostartDir,
> +                                                       def->name)))
> +                goto cleanup;
> +
> +            if (autostart) {
> +                if (virFileMakePath(autostartDir) < 0) {
> +                    virReportSystemError(errno,
> +                                         _("cannot create autostart dir '%s'"),
> +                                         autostartDir);
> +                    goto cleanup;
> +                }
> +
> +                if (symlink(configFile, autostartLink) < 0) {
> +                    virReportSystemError(errno,
> +                                         _("failed to create symlink '%s' "
> +                                           "to '%s'"),
> +                                         autostartLink, configFile);
> +                    goto cleanup;
> +                }
> +            } else {
> +                if (unlink(autostartLink) < 0 &&
> +                    errno != ENOENT && errno != ENOTDIR) {
> +                    virReportSystemError(errno,
> +                                         _("failed to delete symlink '%s'"),
> +                                         autostartLink);
> +                    goto cleanup;
> +                }
> +            }
> +        }
> +
> +        obj->autostart = autostart;
> +    }
> +
> +    ret = 0;
> +
> + cleanup:
> +    VIR_FREE(configFile);
> +    VIR_FREE(autostartLink);
> +    return ret;
> +}

The same review as for [1], keep the file operations in driver code.

Pavel

[1] <https://www.redhat.com/archives/libvir-list/2017-July/msg00359.html>
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list