]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
ch: Enable logging for ch domains
authorPraveen K Paladugu <praveenkpaladugu@gmail.com>
Thu, 19 Dec 2024 14:45:59 +0000 (08:45 -0600)
committerMichal Privoznik <mprivozn@redhat.com>
Fri, 20 Dec 2024 15:24:58 +0000 (16:24 +0100)
Use domainLogContext to enable logging for ch domain process during create
and restore steps.

Signed-off-by: Praveen K Paladugu <praveenkpaladugu@gmail.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/ch/ch_conf.h
src/ch/ch_monitor.c
src/ch/ch_monitor.h
src/ch/ch_process.c

index bac82a01704e11e0dc1413739dff89084784528b..b08573476edcd87a3935702e612dfa5d8c9bd615 100644 (file)
@@ -45,6 +45,8 @@ struct _virCHDriverConfig {
 
     uid_t user;
     gid_t group;
+
+    bool stdioLogD;
 };
 
 G_DEFINE_AUTOPTR_CLEANUP_FUNC(virCHDriverConfig, virObjectUnref);
index 690aea37c8e7e3cfe1c276323ce57bfb445749d4..c9b08b0f75b2408007d685733a69e928a7411d6e 100644 (file)
@@ -536,7 +536,7 @@ chMonitorCreateSocket(const char *socket_path)
 }
 
 virCHMonitor *
-virCHMonitorNew(virDomainObj *vm, virCHDriverConfig *cfg)
+virCHMonitorNew(virDomainObj *vm, virCHDriverConfig *cfg, int logfile)
 {
     g_autoptr(virCHMonitor) mon = NULL;
     g_autoptr(virCommand) cmd = NULL;
@@ -572,6 +572,9 @@ virCHMonitorNew(virDomainObj *vm, virCHDriverConfig *cfg)
     }
 
     cmd = virCommandNew(vm->def->emulator);
+    virCommandSetOutputFD(cmd, &logfile);
+    virCommandSetErrorFD(cmd, &logfile);
+    virCommandNonblockingFDs(cmd);
     virCommandSetUmask(cmd, 0x002);
     socket_fd = chMonitorCreateSocket(mon->socketpath);
     if (socket_fd < 0) {
index 9ec58e5b20321ae9bfdd7ea60cc291c18941d8cd..5c0244711690f07a67754974695eb90b9ccc384e 100644 (file)
@@ -103,7 +103,8 @@ struct _virCHMonitor {
     virCHMonitorThreadInfo *threads;
 };
 
-virCHMonitor *virCHMonitorNew(virDomainObj *vm, virCHDriverConfig *cfg);
+virCHMonitor *virCHMonitorNew(virDomainObj *vm, virCHDriverConfig *cfg,
+                              int logfile);
 void virCHMonitorClose(virCHMonitor *mon);
 G_DEFINE_AUTOPTR_CLEANUP_FUNC(virCHMonitor, virCHMonitorClose);
 
index 61e263b62b8cf9871315a8301bafc8c0dc32bd55..af44aa81a244a3664b205a3d6dd1d5e0d9155d08 100644 (file)
@@ -29,6 +29,7 @@
 #include "ch_process.h"
 #include "domain_cgroup.h"
 #include "domain_interface.h"
+#include "domain_logcontext.h"
 #include "viralloc.h"
 #include "virerror.h"
 #include "virfile.h"
@@ -49,12 +50,13 @@ VIR_LOG_INIT("ch.ch_process");
 
 static virCHMonitor *
 virCHProcessConnectMonitor(virCHDriver *driver,
-                           virDomainObj *vm)
+                           virDomainObj *vm,
+                           int logfile)
 {
     virCHMonitor *monitor = NULL;
     virCHDriverConfig *cfg = virCHDriverGetConfig(driver);
 
-    monitor = virCHMonitorNew(vm, cfg);
+    monitor = virCHMonitorNew(vm, cfg, logfile);
 
     virObjectUnref(cfg);
     return monitor;
@@ -890,6 +892,8 @@ virCHProcessStart(virCHDriver *driver,
     g_autoptr(virCHDriverConfig) cfg = virCHDriverGetConfig(priv->driver);
     g_autofree int *nicindexes = NULL;
     size_t nnicindexes = 0;
+    g_autoptr(domainLogContext) logCtxt = NULL;
+    int logfile = -1;
 
     if (virDomainObjIsActive(vm)) {
         virReportError(VIR_ERR_OPERATION_INVALID, "%s",
@@ -901,6 +905,16 @@ virCHProcessStart(virCHDriver *driver,
         return -1;
     }
 
+    VIR_DEBUG("Creating domain log file for %s domain", vm->def->name);
+    if (!(logCtxt = domainLogContextNew(cfg->stdioLogD, cfg->logDir,
+                                        CH_DRIVER_NAME,
+                                        vm, driver->privileged,
+                                        vm->def->name))) {
+        virLastErrorPrefixMessage("%s", _("can't connect to virtlogd"));
+        return -1;
+    }
+    logfile = domainLogContextGetWriteFD(logCtxt);
+
     if (virCHProcessPrepareDomain(vm) < 0) {
         return -1;
     }
@@ -910,7 +924,7 @@ virCHProcessStart(virCHDriver *driver,
 
     if (!priv->monitor) {
         /* And we can get the first monitor connection now too */
-        if (!(priv->monitor = virCHProcessConnectMonitor(driver, vm))) {
+        if (!(priv->monitor = virCHProcessConnectMonitor(driver, vm, logfile))) {
             virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                            _("failed to create connection to CH socket"));
             goto cleanup;
@@ -1047,10 +1061,22 @@ virCHProcessStartRestore(virCHDriver *driver, virDomainObj *vm, const char *from
     size_t ntapfds = 0;
     size_t nnicindexes = 0;
     int ret = -1;
+    g_autoptr(domainLogContext) logCtxt = NULL;
+    int logfile = -1;
+
+    VIR_DEBUG("Creating domain log file for %s domain", vm->def->name);
+    if (!(logCtxt = domainLogContextNew(cfg->stdioLogD, cfg->logDir,
+                                        CH_DRIVER_NAME,
+                                        vm, driver->privileged,
+                                        vm->def->name))) {
+        virLastErrorPrefixMessage("%s", _("can't connect to virtlogd"));
+        return -1;
+    }
+    logfile = domainLogContextGetWriteFD(logCtxt);
 
     if (!priv->monitor) {
         /* Get the first monitor connection if not already */
-        if (!(priv->monitor = virCHProcessConnectMonitor(driver, vm))) {
+        if (!(priv->monitor = virCHProcessConnectMonitor(driver, vm, logfile))) {
             virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                            _("failed to create connection to CH socket"));
             goto cleanup;