Add logic for handling systemd-machined non-existance

If systemd machine does not exist, return -2 instead of -1,
so that applications don't need to repeat the tedious error
checking code

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
This commit is contained in:
Daniel P. Berrange 2013-07-22 16:33:37 +01:00
parent c64904b745
commit 666bff4faf
3 changed files with 67 additions and 25 deletions

View File

@ -26,6 +26,7 @@
#include "virstring.h" #include "virstring.h"
#include "viralloc.h" #include "viralloc.h"
#include "virutil.h" #include "virutil.h"
#include "virlog.h"
#define VIR_FROM_THIS VIR_FROM_SYSTEMD #define VIR_FROM_THIS VIR_FROM_SYSTEMD
@ -38,6 +39,8 @@
* @rootdir: root directory of machine filesystem * @rootdir: root directory of machine filesystem
* @pidleader: PID of the leader process * @pidleader: PID of the leader process
* @slice: name of the slice to place the machine in * @slice: name of the slice to place the machine in
*
* Returns 0 on success, -1 on fatal error, or -2 if systemd-machine is not available
*/ */
int virSystemdCreateMachine(const char *name, int virSystemdCreateMachine(const char *name,
const char *drivername, const char *drivername,
@ -117,6 +120,7 @@ int virSystemdCreateMachine(const char *name,
* allow further API calls to be made against the object. * allow further API calls to be made against the object.
*/ */
VIR_DEBUG("Attempting to create machine via systemd");
if (virDBusCallMethod(conn, if (virDBusCallMethod(conn,
NULL, NULL,
"org.freedesktop.machine1", "org.freedesktop.machine1",
@ -135,8 +139,15 @@ int virSystemdCreateMachine(const char *name,
(unsigned int)pidleader, (unsigned int)pidleader,
rootdir ? rootdir : "", rootdir ? rootdir : "",
1, "Slice", "s", 1, "Slice", "s",
slicename) < 0) slicename) < 0) {
virErrorPtr err = virGetLastError();
if (err->code == VIR_ERR_DBUS_SERVICE &&
STREQ(err->str2, "org.freedesktop.DBus.Error.ServiceUnknown")) {
virResetLastError();
ret = -2;
}
goto cleanup; goto cleanup;
}
ret = 0; ret = 0;

View File

@ -60,16 +60,20 @@ dbus_bool_t dbus_connection_set_watch_functions(DBusConnection *connection ATTRI
DBusMessage *dbus_connection_send_with_reply_and_block(DBusConnection *connection ATTRIBUTE_UNUSED, DBusMessage *dbus_connection_send_with_reply_and_block(DBusConnection *connection ATTRIBUTE_UNUSED,
DBusMessage *message, DBusMessage *message,
int timeout_milliseconds ATTRIBUTE_UNUSED, int timeout_milliseconds ATTRIBUTE_UNUSED,
DBusError *error ATTRIBUTE_UNUSED) DBusError *error)
{ {
DBusMessage *reply; DBusMessage *reply = NULL;
dbus_message_set_serial(message, 7); dbus_message_set_serial(message, 7);
if (getenv("FAIL_NO_SERVICE")) if (getenv("FAIL_BAD_SERVICE"))
reply = dbus_message_new_error(message, reply = dbus_message_new_error(message,
"org.freedesktop.DBus.Error.ServiceUnknown", "org.freedesktop.systemd.badthing",
"The name org.freedesktop.machine1 was not provided by any .service files"); "Something went wrong creating the machine");
else if (getenv("FAIL_NO_SERVICE"))
dbus_set_error(error,
"org.freedesktop.DBus.Error.ServiceUnknown",
"%s", "The name org.freedesktop.machine1 was not provided by any .service files");
else else
reply = dbus_message_new_method_return(message); reply = dbus_message_new_method_return(message);

View File

@ -82,35 +82,60 @@ static int testCreateNoSystemd(const void *opaque ATTRIBUTE_UNUSED)
3, 3, 3, 3, 3, 3, 3, 3,
4, 4, 4, 4 4, 4, 4, 4
}; };
int rv;
setenv("FAIL_NO_SERVICE", "1", 1); setenv("FAIL_NO_SERVICE", "1", 1);
if (virSystemdCreateMachine("demo", if ((rv = virSystemdCreateMachine("demo",
"qemu", "qemu",
true, true,
uuid, uuid,
NULL, NULL,
123, 123,
false, false,
NULL) == 0) { NULL)) == 0) {
fprintf(stderr, "%s", "Unexpected create machine success\n"); fprintf(stderr, "%s", "Unexpected create machine success\n");
return -1; return -1;
} }
virErrorPtr err = virGetLastError(); if (rv != -2) {
fprintf(stderr, "%s", "Unexpected create machine error\n");
if (!err) {
fprintf(stderr, "No error raised");
return -1; return -1;
} }
if (err->code == VIR_ERR_DBUS_SERVICE && return 0;
STREQ(err->str2, "org.freedesktop.DBus.Error.ServiceUnknown")) }
return 0;
fprintf(stderr, "Unexpected error code %d / message %s\n", static int testCreateBadSystemd(const void *opaque ATTRIBUTE_UNUSED)
err->code, err->str2); {
return -1; 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_BAD_SERVICE", "1", 1);
if ((rv = virSystemdCreateMachine("demo",
"qemu",
true,
uuid,
NULL,
123,
false,
NULL)) == 0) {
fprintf(stderr, "%s", "Unexpected create machine success\n");
return -1;
}
if (rv != -1) {
fprintf(stderr, "%s", "Unexpected create machine error\n");
return -1;
}
return 0;
} }
static int static int
@ -122,7 +147,9 @@ mymain(void)
ret = -1; ret = -1;
if (virtTestRun("Test create machine ", 1, testCreateMachine, NULL) < 0) if (virtTestRun("Test create machine ", 1, testCreateMachine, NULL) < 0)
ret = -1; ret = -1;
if (virtTestRun("Test create nosystemd ", 1, testCreateNoSystemd, NULL) < 0) if (virtTestRun("Test create no systemd ", 1, testCreateNoSystemd, NULL) < 0)
ret = -1;
if (virtTestRun("Test create bad systemd ", 1, testCreateBadSystemd, NULL) < 0)
ret = -1; ret = -1;
return ret==0 ? EXIT_SUCCESS : EXIT_FAILURE; return ret==0 ? EXIT_SUCCESS : EXIT_FAILURE;