mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-02 01:45:17 +00:00
Check if systemd is running before creating machines
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
This commit is contained in:
parent
65a4cb03c7
commit
12ee0b98d3
@ -1319,6 +1319,21 @@ int virDBusIsServiceEnabled(const char *name)
|
|||||||
return ret;
|
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 */
|
#else /* ! WITH_DBUS */
|
||||||
void virDBusSetSharedBus(bool shared ATTRIBUTE_UNUSED)
|
void virDBusSetSharedBus(bool shared ATTRIBUTE_UNUSED)
|
||||||
{
|
{
|
||||||
@ -1397,4 +1412,10 @@ int virDBusIsServiceEnabled(const char *name ATTRIBUTE_UNUSED)
|
|||||||
return -2;
|
return -2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int virDBusIsServiceRegistered(const char *name ATTRIBUTE_UNUSED)
|
||||||
|
{
|
||||||
|
VIR_DEBUG("DBus support not compiled into this binary");
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* ! WITH_DBUS */
|
#endif /* ! WITH_DBUS */
|
||||||
|
@ -49,4 +49,5 @@ int virDBusMessageRead(DBusMessage *msg,
|
|||||||
const char *types, ...);
|
const char *types, ...);
|
||||||
|
|
||||||
int virDBusIsServiceEnabled(const char *name);
|
int virDBusIsServiceEnabled(const char *name);
|
||||||
|
int virDBusIsServiceRegistered(const char *name);
|
||||||
#endif /* __VIR_DBUS_H__ */
|
#endif /* __VIR_DBUS_H__ */
|
||||||
|
@ -173,6 +173,9 @@ int virSystemdCreateMachine(const char *name,
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
if ((ret = virDBusIsServiceRegistered("org.freedesktop.systemd1")) < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
if (!(conn = virDBusGetSystemBus()))
|
if (!(conn = virDBusGetSystemBus()))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
@ -274,6 +277,9 @@ int virSystemdTerminateMachine(const char *name,
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
if ((ret = virDBusIsServiceRegistered("org.freedesktop.systemd1")) < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
if (!(conn = virDBusGetSystemBus()))
|
if (!(conn = virDBusGetSystemBus()))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
@ -66,6 +66,7 @@ DBusMessage *dbus_connection_send_with_reply_and_block(DBusConnection *connectio
|
|||||||
{
|
{
|
||||||
DBusMessage *reply = NULL;
|
DBusMessage *reply = NULL;
|
||||||
const char *service = dbus_message_get_destination(message);
|
const char *service = dbus_message_get_destination(message);
|
||||||
|
const char *member = dbus_message_get_member(message);
|
||||||
|
|
||||||
if (STREQ(service, "org.freedesktop.machine1")) {
|
if (STREQ(service, "org.freedesktop.machine1")) {
|
||||||
if (getenv("FAIL_BAD_SERVICE")) {
|
if (getenv("FAIL_BAD_SERVICE")) {
|
||||||
@ -82,7 +83,8 @@ DBusMessage *dbus_connection_send_with_reply_and_block(DBusConnection *connectio
|
|||||||
} else {
|
} else {
|
||||||
reply = dbus_message_new(DBUS_MESSAGE_TYPE_METHOD_RETURN);
|
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 *svc1 = "org.foo.bar.wizz";
|
||||||
const char *svc2 = "org.freedesktop.machine1";
|
const char *svc2 = "org.freedesktop.machine1";
|
||||||
DBusMessageIter iter, sub;
|
DBusMessageIter iter, sub;
|
||||||
@ -101,6 +103,26 @@ DBusMessage *dbus_connection_send_with_reply_and_block(DBusConnection *connectio
|
|||||||
&svc2))
|
&svc2))
|
||||||
goto error;
|
goto error;
|
||||||
dbus_message_iter_close_container(&iter, &sub);
|
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 {
|
} else {
|
||||||
reply = dbus_message_new(DBUS_MESSAGE_TYPE_METHOD_RETURN);
|
reply = dbus_message_new(DBUS_MESSAGE_TYPE_METHOD_RETURN);
|
||||||
}
|
}
|
||||||
|
@ -135,6 +135,40 @@ static int testCreateNoSystemd(const void *opaque ATTRIBUTE_UNUSED)
|
|||||||
return 0;
|
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)
|
static int testCreateBadSystemd(const void *opaque ATTRIBUTE_UNUSED)
|
||||||
{
|
{
|
||||||
unsigned char uuid[VIR_UUID_BUFLEN] = {
|
unsigned char uuid[VIR_UUID_BUFLEN] = {
|
||||||
@ -216,6 +250,9 @@ mymain(void)
|
|||||||
ret = -1;
|
ret = -1;
|
||||||
if (virtTestRun("Test create no systemd ", testCreateNoSystemd, NULL) < 0)
|
if (virtTestRun("Test create no systemd ", testCreateNoSystemd, NULL) < 0)
|
||||||
ret = -1;
|
ret = -1;
|
||||||
|
if (virtTestRun("Test create systemd not running ",
|
||||||
|
testCreateSystemdNotRunning, NULL) < 0)
|
||||||
|
ret = -1;
|
||||||
if (virtTestRun("Test create bad systemd ", testCreateBadSystemd, NULL) < 0)
|
if (virtTestRun("Test create bad systemd ", testCreateBadSystemd, NULL) < 0)
|
||||||
ret = -1;
|
ret = -1;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user