From 99c51af2ee42de980c258ecb52cf20f96c69ff83 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Tue, 11 Jun 2013 15:45:05 +0200 Subject: [PATCH] qemu: Factor out body of qemuDomainGetMetadata for universal use The function implemented common behavior that can be reused for other hypervisor drivers that use the virDomainObj data structures. Factor out the core into a separate helper func. --- src/conf/domain_conf.c | 55 ++++++++++++++++++++++++++++++++++++++++ src/conf/domain_conf.h | 7 +++++ src/libvirt_private.syms | 1 + src/qemu/qemu_driver.c | 51 +++++-------------------------------- 4 files changed, 69 insertions(+), 45 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 19bb82e4da..d21241809f 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -18531,3 +18531,58 @@ virDomainDiskSourceIsBlockType(virDomainDiskDefPtr def) } return false; } + + +char * +virDomainObjGetMetadata(virDomainObjPtr vm, + int type, + const char *uri ATTRIBUTE_UNUSED, + virCapsPtr caps, + virDomainXMLOptionPtr xmlopt, + unsigned int flags) +{ + virDomainDefPtr def; + char *field = NULL; + char *ret = NULL; + + virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | + VIR_DOMAIN_AFFECT_CONFIG, NULL); + + if (virDomainLiveConfigHelperMethod(caps, xmlopt, vm, &flags, &def) < 0) + goto cleanup; + + /* use correct domain definition according to flags */ + if (flags & VIR_DOMAIN_AFFECT_LIVE) + def = vm->def; + + switch ((virDomainMetadataType) type) { + case VIR_DOMAIN_METADATA_DESCRIPTION: + field = def->description; + break; + + case VIR_DOMAIN_METADATA_TITLE: + field = def->title; + break; + + case VIR_DOMAIN_METADATA_ELEMENT: + virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s", + _(" element is not yet supported")); + goto cleanup; + break; + + default: + virReportError(VIR_ERR_INVALID_ARG, "%s", + _("unknown metadata type")); + goto cleanup; + break; + } + + if (!field) + virReportError(VIR_ERR_NO_DOMAIN_METADATA, "%s", + _("Requested metadata element is not present")); + + ignore_value(VIR_STRDUP(ret, field)); + +cleanup: + return ret; +} diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 539bc1c8af..173d30258a 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2738,4 +2738,11 @@ bool virDomainDiskSourceIsBlockType(virDomainDiskDefPtr def) void virDomainChrSourceDefClear(virDomainChrSourceDefPtr def); +char *virDomainObjGetMetadata(virDomainObjPtr vm, + int type, + const char *uri, + virCapsPtr caps, + virDomainXMLOptionPtr xmlopt, + unsigned int flags); + #endif /* __DOMAIN_CONF_H */ diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 82e3d6fc55..6b5c1c2814 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -309,6 +309,7 @@ virDomainNostateReasonTypeFromString; virDomainNostateReasonTypeToString; virDomainObjAssignDef; virDomainObjCopyPersistentDef; +virDomainObjGetMetadata; virDomainObjGetPersistentDef; virDomainObjGetState; virDomainObjListAdd; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index a09bb8192b..e16713d953 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -15118,21 +15118,16 @@ cleanup: static char * qemuDomainGetMetadata(virDomainPtr dom, int type, - const char *uri ATTRIBUTE_UNUSED, + const char *uri, unsigned int flags) { virQEMUDriverPtr driver = dom->conn->privateData; - virDomainObjPtr vm; - virDomainDefPtr def; - char *ret = NULL; - char *field = NULL; virCapsPtr caps = NULL; - - virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | - VIR_DOMAIN_AFFECT_CONFIG, NULL); + virDomainObjPtr vm; + char *ret = NULL; if (!(vm = qemuDomObjFromDomain(dom))) - goto cleanup; + return NULL; if (virDomainGetMetadataEnsureACL(dom->conn, vm->def) < 0) goto cleanup; @@ -15140,44 +15135,10 @@ qemuDomainGetMetadata(virDomainPtr dom, if (!(caps = virQEMUDriverGetCapabilities(driver, false))) goto cleanup; - if (virDomainLiveConfigHelperMethod(caps, driver->xmlopt, vm, &flags, &def) < 0) - goto cleanup; - - /* use correct domain definition according to flags */ - if (flags & VIR_DOMAIN_AFFECT_LIVE) - def = vm->def; - - switch ((virDomainMetadataType) type) { - case VIR_DOMAIN_METADATA_DESCRIPTION: - field = def->description; - break; - case VIR_DOMAIN_METADATA_TITLE: - field = def->title; - break; - case VIR_DOMAIN_METADATA_ELEMENT: - virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s", - _("QEMU driver does not support " - " element")); - goto cleanup; - break; - default: - virReportError(VIR_ERR_INVALID_ARG, "%s", - _("unknown metadata type")); - goto cleanup; - break; - } - - if (!field) { - virReportError(VIR_ERR_NO_DOMAIN_METADATA, "%s", - _("Requested metadata element is not present")); - goto cleanup; - } - - ignore_value(VIR_STRDUP(ret, field)); + ret = virDomainObjGetMetadata(vm, type, uri, caps, driver->xmlopt, flags); cleanup: - if (vm) - virObjectUnlock(vm); + virObjectUnlock(vm); virObjectUnref(caps); return ret; }