util: storage: Allow passing <source> also for managed PR case

To allow storing status information in the XML move the validation that
the 'path' is not valid for managed PR daemon case into
qemuDomainValidateStorageSource and allow parsing of the data even in
case when managed='yes'.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
This commit is contained in:
Peter Krempa 2018-05-14 07:25:43 +02:00
parent 900fc66121
commit e31f490458
2 changed files with 33 additions and 26 deletions

View File

@ -4204,11 +4204,19 @@ qemuDomainValidateStorageSource(virStorageSourcePtr src,
} }
} }
if (src->pr && if (src->pr) {
!virQEMUCapsGet(qemuCaps, QEMU_CAPS_PR_MANAGER_HELPER)) { if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_PR_MANAGER_HELPER)) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("reservations not supported with this QEMU binary")); _("reservations not supported with this QEMU binary"));
return -1; return -1;
}
if (virStoragePRDefIsManaged(src->pr) && src->pr->path) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("'path' attribute should not be provided for "
"managed reservations"));
return -1;
}
} }
return 0; return 0;

View File

@ -1928,11 +1928,11 @@ virStoragePRDefParseXML(xmlXPathContextPtr ctxt)
goto cleanup; goto cleanup;
} }
if (prd->managed == VIR_TRISTATE_BOOL_NO) { type = virXPathString("string(./source[1]/@type)", ctxt);
type = virXPathString("string(./source[1]/@type)", ctxt); path = virXPathString("string(./source[1]/@path)", ctxt);
path = virXPathString("string(./source[1]/@path)", ctxt); mode = virXPathString("string(./source[1]/@mode)", ctxt);
mode = virXPathString("string(./source[1]/@mode)", ctxt);
if (prd->managed == VIR_TRISTATE_BOOL_NO || type || path || mode) {
if (!type) { if (!type) {
virReportError(VIR_ERR_XML_ERROR, "%s", virReportError(VIR_ERR_XML_ERROR, "%s",
_("missing connection type for <reservations/>")); _("missing connection type for <reservations/>"));
@ -1950,24 +1950,23 @@ virStoragePRDefParseXML(xmlXPathContextPtr ctxt)
_("missing connection mode for <reservations/>")); _("missing connection mode for <reservations/>"));
goto cleanup; goto cleanup;
} }
if (STRNEQ(type, "unix")) {
virReportError(VIR_ERR_XML_ERROR,
_("unsupported connection type for <reservations/>: %s"),
type);
goto cleanup;
}
if (STRNEQ(mode, "client")) {
virReportError(VIR_ERR_XML_ERROR,
_("unsupported connection mode for <reservations/>: %s"),
mode);
goto cleanup;
}
VIR_STEAL_PTR(prd->path, path);
} }
if (type && STRNEQ(type, "unix")) {
virReportError(VIR_ERR_XML_ERROR,
_("unsupported connection type for <reservations/>: %s"),
type);
goto cleanup;
}
if (mode && STRNEQ(mode, "client")) {
virReportError(VIR_ERR_XML_ERROR,
_("unsupported connection mode for <reservations/>: %s"),
mode);
goto cleanup;
}
VIR_STEAL_PTR(prd->path, path);
VIR_STEAL_PTR(ret, prd); VIR_STEAL_PTR(ret, prd);
cleanup: cleanup:
@ -1986,7 +1985,7 @@ virStoragePRDefFormat(virBufferPtr buf,
{ {
virBufferAsprintf(buf, "<reservations managed='%s'", virBufferAsprintf(buf, "<reservations managed='%s'",
virTristateBoolTypeToString(prd->managed)); virTristateBoolTypeToString(prd->managed));
if (prd->managed == VIR_TRISTATE_BOOL_NO) { if (prd->path) {
virBufferAddLit(buf, ">\n"); virBufferAddLit(buf, ">\n");
virBufferAdjustIndent(buf, 2); virBufferAdjustIndent(buf, 2);
virBufferAddLit(buf, "<source type='unix'"); virBufferAddLit(buf, "<source type='unix'");