[PATCH 0/2] CH: Add support for a configuration file and log level configuration

Similar to the qemu.conf file that allows QEMU specific configurations we add the possibility to specify a ch.conf file for Cloud Hypervisor configuration. The initial single config option is the log level, which sets the verbosity of the Cloud Hypervisor process. This allows for simpler debugging when using Cloud Hypervisor via libvirt. Stefan Kober (2): ch: Add config file support ch: add log level configuration option src/ch/ch_conf.c | 32 ++++++++++++++++++++++++++++++++ src/ch/ch_conf.h | 18 ++++++++++++++++++ src/ch/ch_driver.c | 6 ++++++ src/ch/ch_monitor.c | 6 ++++++ 4 files changed, 62 insertions(+) -- 2.49.0

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. --- src/ch/ch_conf.c | 22 ++++++++++++++++++++++ src/ch/ch_conf.h | 3 +++ src/ch/ch_driver.c | 6 ++++++ 3 files changed, 31 insertions(+) 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; -- 2.49.0

On 5/22/25 08:21, 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. --- src/ch/ch_conf.c | 22 ++++++++++++++++++++++ src/ch/ch_conf.h | 3 +++ src/ch/ch_driver.c | 6 ++++++ 3 files changed, 31 insertions(+)
This is lacking documentation. Users wouldn't know that this new config file is read. And for completeness, maybe we want to add some example file (for this particular patch basically empty ch.conf with only a comment on top, just like qemu.conf.in has it) and augeas file so that the config file can be modified pragmatically? Otherwise looking good. Michal

Allow a user to set the verbosity of the cloud hypervisor instances by specifying it in the ch.conf configuration file. --- src/ch/ch_conf.c | 10 ++++++++++ src/ch/ch_conf.h | 15 +++++++++++++++ src/ch/ch_monitor.c | 6 ++++++ 3 files changed, 31 insertions(+) diff --git a/src/ch/ch_conf.c b/src/ch/ch_conf.c index 7d3f600707..3e700586ca 100644 --- a/src/ch/ch_conf.c +++ b/src/ch/ch_conf.c @@ -98,6 +98,16 @@ int virCHDriverConfigLoadFile(virCHDriverConfig *cfg, if (!(conf = virConfReadFile(filename, 0))) return -1; + if (virConfGetValueUInt(conf, "log_level", &cfg->logLevel) < 0) + return -1; + + if (!(cfg->logLevel < VIR_CH_LOGLEVEL_LAST)) { + VIR_WARN("Invalid log level %u. Using default %u instead.", + cfg->logLevel, + VIR_CH_LOGLEVEL_DEFAULT); + cfg->logLevel = VIR_CH_LOGLEVEL_DEFAULT; + } + return 0; } diff --git a/src/ch/ch_conf.h b/src/ch/ch_conf.h index 2f0d090d35..1660762f2b 100644 --- a/src/ch/ch_conf.h +++ b/src/ch/ch_conf.h @@ -34,6 +34,19 @@ typedef struct _virCHDriver virCHDriver; typedef struct _virCHDriverConfig virCHDriverConfig; +typedef enum { + /* Standard log level only showing warning and error messages. */ + VIR_CH_LOGLEVEL_DEFAULT = 0, + + /* Additional info messages are shown. Will not spam the log. */ + VIR_CH_LOGLEVEL_INFO, + + /* Additional debug messages are shown. Will be very verbose. */ + VIR_CH_LOGLEVEL_DEBUG, + + VIR_CH_LOGLEVEL_LAST +} virCHLogLevel; + struct _virCHDriverConfig { GObject parent; @@ -48,6 +61,8 @@ struct _virCHDriverConfig { gid_t group; bool stdioLogD; + + virCHLogLevel logLevel; }; G_DEFINE_AUTOPTR_CLEANUP_FUNC(virCHDriverConfig, virObjectUnref); diff --git a/src/ch/ch_monitor.c b/src/ch/ch_monitor.c index 3d3b4cb87d..6bf877fef3 100644 --- a/src/ch/ch_monitor.c +++ b/src/ch/ch_monitor.c @@ -698,6 +698,12 @@ virCHMonitorNew(virDomainObj *vm, virCHDriverConfig *cfg, int logfile) return NULL; } + if (cfg->logLevel == VIR_CH_LOGLEVEL_INFO) { + virCommandAddArg(cmd, "-v"); + } else if (cfg->logLevel == VIR_CH_LOGLEVEL_DEBUG) { + virCommandAddArg(cmd, "-vv"); + } + virCommandAddArg(cmd, "--api-socket"); virCommandAddArgFormat(cmd, "fd=%d", socket_fd); virCommandPassFD(cmd, socket_fd, VIR_COMMAND_PASS_FD_CLOSE_PARENT); -- 2.49.0

On 5/22/25 08:21, Stefan Kober wrote:
Allow a user to set the verbosity of the cloud hypervisor instances by specifying it in the ch.conf configuration file. --- src/ch/ch_conf.c | 10 ++++++++++ src/ch/ch_conf.h | 15 +++++++++++++++ src/ch/ch_monitor.c | 6 ++++++ 3 files changed, 31 insertions(+)
Here you'd add some rules to the augeas file, example with comment into ch.conf and maybe a test case.
diff --git a/src/ch/ch_conf.c b/src/ch/ch_conf.c index 7d3f600707..3e700586ca 100644 --- a/src/ch/ch_conf.c +++ b/src/ch/ch_conf.c @@ -98,6 +98,16 @@ int virCHDriverConfigLoadFile(virCHDriverConfig *cfg, if (!(conf = virConfReadFile(filename, 0))) return -1;
+ if (virConfGetValueUInt(conf, "log_level", &cfg->logLevel) < 0) + return -1; + + if (!(cfg->logLevel < VIR_CH_LOGLEVEL_LAST)) { + VIR_WARN("Invalid log level %u. Using default %u instead.", + cfg->logLevel, + VIR_CH_LOGLEVEL_DEFAULT); + cfg->logLevel = VIR_CH_LOGLEVEL_DEFAULT;
I think we should just reject invalid values from the beginning. If user requests invalid value they should fix their config file instead of us falling back onto some default, albeit sensible. For instance, if I'd provide "log_level" as a float the virConfGetValueUInt() above would reject parsing anyways.
+ } + return 0; }
Michal

On 5/22/25 08:21, Stefan Kober wrote:
Similar to the qemu.conf file that allows QEMU specific configurations we add the possibility to specify a ch.conf file for Cloud Hypervisor configuration.
The initial single config option is the log level, which sets the verbosity of the Cloud Hypervisor process. This allows for simpler debugging when using Cloud Hypervisor via libvirt.
Stefan Kober (2): ch: Add config file support ch: add log level configuration option
src/ch/ch_conf.c | 32 ++++++++++++++++++++++++++++++++ src/ch/ch_conf.h | 18 ++++++++++++++++++ src/ch/ch_driver.c | 6 ++++++ src/ch/ch_monitor.c | 6 ++++++ 4 files changed, 62 insertions(+)
The idea is sound, but I think we need a couple of more files. Also, this deserves to be mentioned in NEWS.rst ;-) Michal
participants (2)
-
Michal Prívozník
-
Stefan Kober