[PATCH v4 1/3] ch: Add config file support

Stefan Kober posted 3 patches 2 weeks, 6 days ago
[PATCH v4 1/3] ch: Add config file support
Posted by Stefan Kober 2 weeks, 6 days ago
Similar to the QEMU driver, the ch driver receives support for
configuration files that allows doing certain configuration on the
virtchd daemon.

The initial use case will be setting the verbosity of the cloud
hypervisor instances started by virtchd, but the implementation allows
for adding further options.

Signed-off-by: Stefan Kober <stefan.kober@cyberus-technology.de>
---
 src/ch/ch.conf         |  3 +++
 src/ch/ch_conf.c       | 22 ++++++++++++++++++++++
 src/ch/ch_conf.h       |  3 +++
 src/ch/ch_driver.c     |  6 ++++++
 src/ch/libvirtd_ch.aug | 40 ++++++++++++++++++++++++++++++++++++++++
 5 files changed, 74 insertions(+)
 create mode 100644 src/ch/ch.conf
 create mode 100644 src/ch/libvirtd_ch.aug

diff --git a/src/ch/ch.conf b/src/ch/ch.conf
new file mode 100644
index 0000000000..8ce987f675
--- /dev/null
+++ b/src/ch/ch.conf
@@ -0,0 +1,3 @@
+# Master configuration file for the QEMU driver.
+# All settings described here are optional - if omitted, sensible
+# defaults are used.
diff --git a/src/ch/ch_conf.c b/src/ch/ch_conf.c
index cab97639c4..7d3f600707 100644
--- a/src/ch/ch_conf.c
+++ b/src/ch/ch_conf.c
@@ -22,6 +22,7 @@
 
 #include "configmake.h"
 #include "vircommand.h"
+#include "virconf.h"
 #include "virfile.h"
 #include "virlog.h"
 #include "virobject.h"
@@ -81,6 +82,25 @@ virCaps *virCHDriverCapsInit(void)
     return g_steal_pointer(&caps);
 }
 
+int virCHDriverConfigLoadFile(virCHDriverConfig *cfg,
+                              const char *filename)
+{
+    g_autoptr(virConf) conf = NULL;
+
+    /* Just check the file is readable before opening it, otherwise
+     * libvirt emits an error.
+     */
+    if (access(filename, R_OK) == -1) {
+        VIR_INFO("Could not read ch config file %s", filename);
+        return 0;
+    }
+
+    if (!(conf = virConfReadFile(filename, 0)))
+        return -1;
+
+    return 0;
+}
+
 /**
  * virCHDriverGetCapabilities:
  *
@@ -149,6 +169,7 @@ virCHDriverConfigNew(bool privileged)
         cfg->logDir = g_strdup_printf("%s/log/libvirt/ch", LOCALSTATEDIR);
         cfg->stateDir = g_strdup_printf("%s/libvirt/ch", RUNSTATEDIR);
         cfg->saveDir = g_strdup_printf("%s/lib/libvirt/ch/save", LOCALSTATEDIR);
+        cfg->configDir = g_strdup_printf("%s/lib/libvirt/ch", LOCALSTATEDIR);
 
     } else {
         g_autofree char *rundir = NULL;
@@ -164,6 +185,7 @@ virCHDriverConfigNew(bool privileged)
 
         configbasedir = virGetUserConfigDirectory();
         cfg->saveDir = g_strdup_printf("%s/ch/save", configbasedir);
+        cfg->configDir = g_strdup_printf("%s/ch", configbasedir);
     }
 
     return cfg;
diff --git a/src/ch/ch_conf.h b/src/ch/ch_conf.h
index b08573476e..2f0d090d35 100644
--- a/src/ch/ch_conf.h
+++ b/src/ch/ch_conf.h
@@ -38,6 +38,7 @@ struct _virCHDriverConfig {
     GObject parent;
 
     char *stateDir;
+    char *configDir;
     char *logDir;
     char *saveDir;
 
@@ -103,6 +104,8 @@ struct _CHSaveXMLHeader {
     uint32_t unused[11];
 };
 
+int virCHDriverConfigLoadFile(virCHDriverConfig *cfg,
+                                const char *filename);
 virCaps *virCHDriverCapsInit(void);
 virCaps *virCHDriverGetCapabilities(virCHDriver *driver,
                                       bool refresh);
diff --git a/src/ch/ch_driver.c b/src/ch/ch_driver.c
index 3bdcf66ebd..cf6874f22e 100644
--- a/src/ch/ch_driver.c
+++ b/src/ch/ch_driver.c
@@ -1411,6 +1411,7 @@ chStateInitialize(bool privileged,
                   virStateInhibitCallback callback G_GNUC_UNUSED,
                   void *opaque G_GNUC_UNUSED)
 {
+    g_autofree char *driverConf = NULL;
     int ret = VIR_DRV_STATE_INIT_ERROR;
     int rv;
 
@@ -1447,6 +1448,11 @@ chStateInitialize(bool privileged,
     if (!(ch_driver->config = virCHDriverConfigNew(privileged)))
         goto cleanup;
 
+    driverConf = g_strdup_printf("%s/ch.conf", ch_driver->config->configDir);
+
+    if (virCHDriverConfigLoadFile(ch_driver->config, driverConf) < 0)
+        goto cleanup;
+
     if (!(ch_driver->hostdevMgr = virHostdevManagerGetDefault()))
         goto cleanup;
 
diff --git a/src/ch/libvirtd_ch.aug b/src/ch/libvirtd_ch.aug
new file mode 100644
index 0000000000..d0b0964987
--- /dev/null
+++ b/src/ch/libvirtd_ch.aug
@@ -0,0 +1,40 @@
+(* /etc/libvirt/ch.conf *)
+
+module Libvirtd_ch =
+   autoload xfm
+
+   let eol   = del /[ \t]*\n/ "\n"
+   let value_sep   = del /[ \t]*=[ \t]*/  " = "
+   let indent = del /[ \t]*/ ""
+
+   let array_sep  = del /,[ \t\n]*/ ", "
+   let array_start = del /\[[ \t\n]*/ "[ "
+   let array_end = del /\]/ "]"
+
+   let str_val = del /\"/ "\"" . store /[^\"]*/ . del /\"/ "\""
+   let bool_val = store /0|1/
+   let int_val = store /[0-9]+/
+   let str_array_element = [ seq "el" . str_val ] . del /[ \t\n]*/ ""
+   let str_array_val = counter "el" . array_start . ( str_array_element . ( array_sep . str_array_element ) * ) ? . array_end
+
+   let str_entry       (kw:string) = [ key kw . value_sep . str_val ]
+   let bool_entry      (kw:string) = [ key kw . value_sep . bool_val ]
+   let int_entry       (kw:string) = [ key kw . value_sep . int_val ]
+   let str_array_entry (kw:string) = [ key kw . value_sep . str_array_val ]
+
+   (* Config entry grouped by function - same order as example config *)
+   let config_entry = bool_entry "placeholder"
+
+   (* Each entry in the config is one of the following three ... *)
+   let entry = config_entry
+   let comment = [ label "#comment" . del /#[ \t]*/ "# " .  store /([^ \t\n][^\n]*)?/ . del /\n/ "\n" ]
+   let empty = [ label "#empty" . eol ]
+
+   let record = indent . entry . eol
+
+   let lns = ( record | comment | empty ) *
+
+   let filter = incl "/etc/libvirt/ch.conf"
+              . Util.stdexcl
+
+   let xfm = transform lns filter
-- 
2.50.1
Re: [PATCH v4 1/3] ch: Add config file support
Posted by Michal Prívozník via Devel 2 weeks, 6 days ago
On 8/18/25 11:20, Stefan Kober wrote:
> Similar to the QEMU driver, the ch driver receives support for
> configuration files that allows doing certain configuration on the
> virtchd daemon.
> 
> The initial use case will be setting the verbosity of the cloud
> hypervisor instances started by virtchd, but the implementation allows
> for adding further options.
> 
> Signed-off-by: Stefan Kober <stefan.kober@cyberus-technology.de>
> ---
>  src/ch/ch.conf         |  3 +++
>  src/ch/ch_conf.c       | 22 ++++++++++++++++++++++
>  src/ch/ch_conf.h       |  3 +++
>  src/ch/ch_driver.c     |  6 ++++++
>  src/ch/libvirtd_ch.aug | 40 ++++++++++++++++++++++++++++++++++++++++
>  5 files changed, 74 insertions(+)
>  create mode 100644 src/ch/ch.conf
>  create mode 100644 src/ch/libvirtd_ch.aug
> 
> diff --git a/src/ch/ch.conf b/src/ch/ch.conf
> new file mode 100644
> index 0000000000..8ce987f675
> --- /dev/null
> +++ b/src/ch/ch.conf
> @@ -0,0 +1,3 @@
> +# Master configuration file for the QEMU driver.

s/QEMU/CH/

> +# All settings described here are optional - if omitted, sensible
> +# defaults are used.
> diff --git a/src/ch/ch_conf.c b/src/ch/ch_conf.c
> index cab97639c4..7d3f600707 100644
> --- a/src/ch/ch_conf.c
> +++ b/src/ch/ch_conf.c
> @@ -22,6 +22,7 @@
>  
>  #include "configmake.h"
>  #include "vircommand.h"
> +#include "virconf.h"
>  #include "virfile.h"
>  #include "virlog.h"
>  #include "virobject.h"
> @@ -81,6 +82,25 @@ virCaps *virCHDriverCapsInit(void)
>      return g_steal_pointer(&caps);
>  }
>  
> +int virCHDriverConfigLoadFile(virCHDriverConfig *cfg,

This is unused, yet. G_GNUC_UNUSED annotation should be added here, only
to be removed in the next patch.

> +                              const char *filename)
> +{
> +    g_autoptr(virConf) conf = NULL;
> +
> +    /* Just check the file is readable before opening it, otherwise
> +     * libvirt emits an error.
> +     */
> +    if (access(filename, R_OK) == -1) {
> +        VIR_INFO("Could not read ch config file %s", filename);
> +        return 0;
> +    }
> +
> +    if (!(conf = virConfReadFile(filename, 0)))
> +        return -1;
> +
> +    return 0;
> +}
> +

Michal