]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Check if systemd is running before creating machines
authorJán Tomko <jtomko@redhat.com>
Thu, 27 Feb 2014 20:21:57 +0000 (21:21 +0100)
committerJán Tomko <jtomko@redhat.com>
Tue, 4 Mar 2014 08:14:52 +0000 (09:14 +0100)
If systemd is installed, but is not the init system,
systemd-machined fails with an unhelpful error message:
Launch helper exited with unknown return code 1

Currently we only check if the "machine1" service is
available (in ListActivatableNames).
Also check if "systemd1" service is registered with DBus
(ListNames).

This fixes https://bugs.gentoo.org/show_bug.cgi?id=493246#c22

src/util/virdbus.c
src/util/virdbus.h
src/util/virsystemd.c
tests/virsystemdmock.c
tests/virsystemdtest.c

index eace9238138d600acabb2a6d3cfe9ba3d7f34214..9bddbfc66a07a371f6d72dc9d9c066578984a39e 100644 (file)
@@ -1319,6 +1319,21 @@ int virDBusIsServiceEnabled(const char *name)
     return ret;
 }
 
+/**
+ * virDBusIsServiceRegistered
+ * @name: service name
+ *
+ * Retruns 0 if service is registered, -1 on fatal error, or -2 if service is not registered
+ */
+int virDBusIsServiceRegistered(const char *name)
+{
+    int ret = virDBusIsServiceInList("ListNames", name);
+
+    VIR_DEBUG("Service %s is %s", name, ret ? "not registered" : "registered");
+
+    return ret;
+}
+
 #else /* ! WITH_DBUS */
 void virDBusSetSharedBus(bool shared ATTRIBUTE_UNUSED)
 {
@@ -1397,4 +1412,10 @@ int virDBusIsServiceEnabled(const char *name ATTRIBUTE_UNUSED)
     return -2;
 }
 
+int virDBusIsServiceRegistered(const char *name ATTRIBUTE_UNUSED)
+{
+    VIR_DEBUG("DBus support not compiled into this binary");
+    return -2;
+}
+
 #endif /* ! WITH_DBUS */
index 979c566fa01811afee42752a875b2d0efb6f3e58..1ca86419f0dd131a9dd0538a40ac270572741b5e 100644 (file)
@@ -49,4 +49,5 @@ int virDBusMessageRead(DBusMessage *msg,
                        const char *types, ...);
 
 int virDBusIsServiceEnabled(const char *name);
+int virDBusIsServiceRegistered(const char *name);
 #endif /* __VIR_DBUS_H__ */
index 8adf20963a9e72f0e81b5bef3581bfbcc5ee5a58..d263c58e0478d1c2e7c07422b81811dc26fedc38 100644 (file)
@@ -173,6 +173,9 @@ int virSystemdCreateMachine(const char *name,
     if (ret < 0)
         return ret;
 
+    if ((ret = virDBusIsServiceRegistered("org.freedesktop.systemd1")) < 0)
+        return ret;
+
     if (!(conn = virDBusGetSystemBus()))
         return -1;
 
@@ -274,6 +277,9 @@ int virSystemdTerminateMachine(const char *name,
     if (ret < 0)
         return ret;
 
+    if ((ret = virDBusIsServiceRegistered("org.freedesktop.systemd1")) < 0)
+        return ret;
+
     if (!(conn = virDBusGetSystemBus()))
         return -1;
 
index 0295231ed79437ad6a2049635a47872f256b7561..b4fcf6e9c559ef2b62cbf33fa29ad99ee9366d92 100644 (file)
@@ -66,6 +66,7 @@ DBusMessage *dbus_connection_send_with_reply_and_block(DBusConnection *connectio
 {
     DBusMessage *reply = NULL;
     const char *service = dbus_message_get_destination(message);
+    const char *member = dbus_message_get_member(message);
 
     if (STREQ(service, "org.freedesktop.machine1")) {
         if (getenv("FAIL_BAD_SERVICE")) {
@@ -82,7 +83,8 @@ DBusMessage *dbus_connection_send_with_reply_and_block(DBusConnection *connectio
         } else {
             reply = dbus_message_new(DBUS_MESSAGE_TYPE_METHOD_RETURN);
         }
-    } else if (STREQ(service, "org.freedesktop.DBus")) {
+    } else if (STREQ(service, "org.freedesktop.DBus") &&
+               STREQ(member, "ListActivatableNames")) {
         const char *svc1 = "org.foo.bar.wizz";
         const char *svc2 = "org.freedesktop.machine1";
         DBusMessageIter iter, sub;
@@ -101,6 +103,26 @@ DBusMessage *dbus_connection_send_with_reply_and_block(DBusConnection *connectio
                                             &svc2))
             goto error;
         dbus_message_iter_close_container(&iter, &sub);
+    } else if (STREQ(service, "org.freedesktop.DBus") &&
+               STREQ(member, "ListNames")) {
+        const char *svc1 = "org.foo.bar.wizz";
+        const char *svc2 = "org.freedesktop.systemd1";
+        DBusMessageIter iter, sub;
+        reply = dbus_message_new(DBUS_MESSAGE_TYPE_METHOD_RETURN);
+        dbus_message_iter_init_append(reply, &iter);
+        dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
+                                         "s", &sub);
+
+        if (!dbus_message_iter_append_basic(&sub,
+                                            DBUS_TYPE_STRING,
+                                            &svc1))
+            goto error;
+        if ((!getenv("FAIL_NO_SERVICE") && !getenv("FAIL_NOT_REGISTERED")) &&
+            !dbus_message_iter_append_basic(&sub,
+                                            DBUS_TYPE_STRING,
+                                            &svc2))
+            goto error;
+        dbus_message_iter_close_container(&iter, &sub);
     } else {
         reply = dbus_message_new(DBUS_MESSAGE_TYPE_METHOD_RETURN);
     }
index 9f6fc839cc3fbd43ea748a461e04799f8ee46e68..9752d12b3a68d7126c965821676867195538840e 100644 (file)
@@ -135,6 +135,40 @@ static int testCreateNoSystemd(const void *opaque ATTRIBUTE_UNUSED)
     return 0;
 }
 
+static int testCreateSystemdNotRunning(const void *opaque ATTRIBUTE_UNUSED)
+{
+    unsigned char uuid[VIR_UUID_BUFLEN] = {
+        1, 1, 1, 1,
+        2, 2, 2, 2,
+        3, 3, 3, 3,
+        4, 4, 4, 4
+    };
+    int rv;
+
+    setenv("FAIL_NOT_REGISTERED", "1", 1);
+
+    if ((rv = virSystemdCreateMachine("demo",
+                                      "qemu",
+                                      true,
+                                      uuid,
+                                      NULL,
+                                      123,
+                                      false,
+                                      NULL)) == 0) {
+        unsetenv("FAIL_NOT_REGISTERED");
+        fprintf(stderr, "%s", "Unexpected create machine success\n");
+        return -1;
+    }
+    unsetenv("FAIL_NOT_REGISTERED");
+
+    if (rv != -2) {
+        fprintf(stderr, "%s", "Unexpected create machine error\n");
+        return -1;
+    }
+
+    return 0;
+}
+
 static int testCreateBadSystemd(const void *opaque ATTRIBUTE_UNUSED)
 {
     unsigned char uuid[VIR_UUID_BUFLEN] = {
@@ -216,6 +250,9 @@ mymain(void)
         ret = -1;
     if (virtTestRun("Test create no systemd ", testCreateNoSystemd, NULL) < 0)
         ret = -1;
+    if (virtTestRun("Test create systemd not running ",
+                    testCreateSystemdNotRunning, NULL) < 0)
+        ret = -1;
     if (virtTestRun("Test create bad systemd ", testCreateBadSystemd, NULL) < 0)
         ret = -1;