mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-26 22:45:17 +00:00
Perform feature flag compat checking in QEMU migration cookies
To allow new mandatory migration cookie data to be introduced, add support for checking supported feature flags when parsing migration cookie. * src/qemu/qemu_migration.c: Feature flag checking in migration cookie parsing
This commit is contained in:
parent
5e09aea7b0
commit
f88af9dc16
2
.gnulib
2
.gnulib
@ -1 +1 @@
|
|||||||
Subproject commit 2c25c9ebe8db1415bfde25f0a451767332c8cf59
|
Subproject commit 64a5e38bced6c8f5117efbed95cdfd8ca133ed54
|
@ -48,7 +48,18 @@
|
|||||||
#define timeval_to_ms(tv) (((tv).tv_sec * 1000ull) + ((tv).tv_usec / 1000))
|
#define timeval_to_ms(tv) (((tv).tv_sec * 1000ull) + ((tv).tv_usec / 1000))
|
||||||
|
|
||||||
enum qemuMigrationCookieFlags {
|
enum qemuMigrationCookieFlags {
|
||||||
QEMU_MIGRATION_COOKIE_GRAPHICS = (1 << 0),
|
QEMU_MIGRATION_COOKIE_FLAG_GRAPHICS,
|
||||||
|
|
||||||
|
QEMU_MIGRATION_COOKIE_FLAG_LAST
|
||||||
|
};
|
||||||
|
|
||||||
|
VIR_ENUM_DECL(qemuMigrationCookieFlag);
|
||||||
|
VIR_ENUM_IMPL(qemuMigrationCookieFlag,
|
||||||
|
QEMU_MIGRATION_COOKIE_FLAG_LAST,
|
||||||
|
"graphics");
|
||||||
|
|
||||||
|
enum qemuMigrationCookieFeatures {
|
||||||
|
QEMU_MIGRATION_COOKIE_GRAPHICS = (1 << QEMU_MIGRATION_COOKIE_FLAG_GRAPHICS),
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct _qemuMigrationCookieGraphics qemuMigrationCookieGraphics;
|
typedef struct _qemuMigrationCookieGraphics qemuMigrationCookieGraphics;
|
||||||
@ -65,6 +76,7 @@ typedef struct _qemuMigrationCookie qemuMigrationCookie;
|
|||||||
typedef qemuMigrationCookie *qemuMigrationCookiePtr;
|
typedef qemuMigrationCookie *qemuMigrationCookiePtr;
|
||||||
struct _qemuMigrationCookie {
|
struct _qemuMigrationCookie {
|
||||||
int flags;
|
int flags;
|
||||||
|
int flagsMandatory;
|
||||||
|
|
||||||
/* Host properties */
|
/* Host properties */
|
||||||
unsigned char hostuuid[VIR_UUID_BUFLEN];
|
unsigned char hostuuid[VIR_UUID_BUFLEN];
|
||||||
@ -286,6 +298,7 @@ static void qemuMigrationCookieXMLFormat(virBufferPtr buf,
|
|||||||
{
|
{
|
||||||
char uuidstr[VIR_UUID_STRING_BUFLEN];
|
char uuidstr[VIR_UUID_STRING_BUFLEN];
|
||||||
char hostuuidstr[VIR_UUID_STRING_BUFLEN];
|
char hostuuidstr[VIR_UUID_STRING_BUFLEN];
|
||||||
|
int i;
|
||||||
|
|
||||||
virUUIDFormat(mig->uuid, uuidstr);
|
virUUIDFormat(mig->uuid, uuidstr);
|
||||||
virUUIDFormat(mig->hostuuid, hostuuidstr);
|
virUUIDFormat(mig->hostuuid, hostuuidstr);
|
||||||
@ -296,6 +309,12 @@ static void qemuMigrationCookieXMLFormat(virBufferPtr buf,
|
|||||||
virBufferEscapeString(buf, " <hostname>%s</hostname>\n", mig->hostname);
|
virBufferEscapeString(buf, " <hostname>%s</hostname>\n", mig->hostname);
|
||||||
virBufferAsprintf(buf, " <hostuuid>%s</hostuuid>\n", hostuuidstr);
|
virBufferAsprintf(buf, " <hostuuid>%s</hostuuid>\n", hostuuidstr);
|
||||||
|
|
||||||
|
for (i = 0 ; i < QEMU_MIGRATION_COOKIE_FLAG_LAST ; i++) {
|
||||||
|
if (mig->flagsMandatory & (1 << i))
|
||||||
|
virBufferAsprintf(buf, " <feature name='%s'/>\n",
|
||||||
|
qemuMigrationCookieFlagTypeToString(i));
|
||||||
|
}
|
||||||
|
|
||||||
if ((mig->flags & QEMU_MIGRATION_COOKIE_GRAPHICS) &&
|
if ((mig->flags & QEMU_MIGRATION_COOKIE_GRAPHICS) &&
|
||||||
mig->graphics)
|
mig->graphics)
|
||||||
qemuMigrationCookieGraphicsXMLFormat(buf, mig->graphics);
|
qemuMigrationCookieGraphicsXMLFormat(buf, mig->graphics);
|
||||||
@ -377,6 +396,8 @@ qemuMigrationCookieXMLParse(qemuMigrationCookiePtr mig,
|
|||||||
{
|
{
|
||||||
char uuidstr[VIR_UUID_STRING_BUFLEN];
|
char uuidstr[VIR_UUID_STRING_BUFLEN];
|
||||||
char *tmp;
|
char *tmp;
|
||||||
|
xmlNodePtr *nodes = NULL;
|
||||||
|
int i, n;
|
||||||
|
|
||||||
/* We don't store the uuid, name, hostname, or hostuuid
|
/* We don't store the uuid, name, hostname, or hostuuid
|
||||||
* values. We just compare them to local data to do some
|
* values. We just compare them to local data to do some
|
||||||
@ -440,6 +461,38 @@ qemuMigrationCookieXMLParse(qemuMigrationCookiePtr mig,
|
|||||||
}
|
}
|
||||||
VIR_FREE(tmp);
|
VIR_FREE(tmp);
|
||||||
|
|
||||||
|
/* Check to ensure all mandatory features from XML are also
|
||||||
|
* present in 'flags' */
|
||||||
|
if ((n = virXPathNodeSet("./features", ctxt, &nodes)) < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
for (i = 0 ; i < n ; i++) {
|
||||||
|
int val;
|
||||||
|
char *str = virXMLPropString(nodes[i], "name");
|
||||||
|
if (!str) {
|
||||||
|
qemuReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
|
"%s", _("missing feature name"));
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((val = qemuMigrationCookieFlagTypeFromString(str)) < 0) {
|
||||||
|
qemuReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
|
_("Unknown migration cookie feature %s"),
|
||||||
|
str);
|
||||||
|
VIR_FREE(str);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((flags & (1 << val)) == 0) {
|
||||||
|
qemuReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
|
_("Unsupported migration cookie feature %s"),
|
||||||
|
str);
|
||||||
|
VIR_FREE(str);
|
||||||
|
}
|
||||||
|
VIR_FREE(str);
|
||||||
|
}
|
||||||
|
VIR_FREE(nodes);
|
||||||
|
|
||||||
if ((flags & QEMU_MIGRATION_COOKIE_GRAPHICS) &&
|
if ((flags & QEMU_MIGRATION_COOKIE_GRAPHICS) &&
|
||||||
virXPathBoolean("count(./graphics) > 0", ctxt) &&
|
virXPathBoolean("count(./graphics) > 0", ctxt) &&
|
||||||
(!(mig->graphics = qemuMigrationCookieGraphicsXMLParse(ctxt))))
|
(!(mig->graphics = qemuMigrationCookieGraphicsXMLParse(ctxt))))
|
||||||
@ -449,6 +502,7 @@ qemuMigrationCookieXMLParse(qemuMigrationCookiePtr mig,
|
|||||||
|
|
||||||
error:
|
error:
|
||||||
VIR_FREE(tmp);
|
VIR_FREE(tmp);
|
||||||
|
VIR_FREE(nodes);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user