This API function extends and generalizes the virDomainGetState function
by returning a dictionary of typed parameters.
In later commits, the domain state, reason and the previously introduced
additional state information are returned.
Reviewed-by: Stefan Zimmermann <stzi(a)linux.ibm.com>
Reviewed-by: Boris Fiuczynski <fiuczy(a)linux.ibm.com>
Signed-off-by: Bjoern Walk <bwalk(a)linux.ibm.com>
---
include/libvirt/libvirt-domain.h | 24 ++++++++++++++
src/driver-hypervisor.h | 7 ++++
src/libvirt-domain.c | 56 ++++++++++++++++++++++++++++++++
src/libvirt_public.syms | 5 +++
4 files changed, 92 insertions(+)
diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
index 796f2e14..c7b85cd0 100644
--- a/include/libvirt/libvirt-domain.h
+++ b/include/libvirt/libvirt-domain.h
@@ -1254,6 +1254,30 @@ int virDomainGetState (virDomainPtr
domain,
int *reason,
unsigned int flags);
+/**
+ * VIR_DOMAIN_STATE_PARAMS_STATE:
+ * state of the domain (cf. virDomainState) as an int
+ */
+# define VIR_DOMAIN_STATE_PARAMS_STATE "state"
+
+/**
+ * VIR_DOMAIN_STATE_PARAMS_REASON:
+ * state reason of the domain (one of virDomain*Reason) as an int
+ */
+# define VIR_DOMAIN_STATE_PARAMS_REASON "reason"
+
+/**
+ * VIR_DOMAIN_STATE_PARAMS_INFO:
+ * additional information for certain state reasons as a string
+ */
+# define VIR_DOMAIN_STATE_PARAMS_INFO "info"
+
+int virDomainGetStateParams(virDomainPtr domain,
+ virTypedParameterPtr *params,
+ int *nparams,
+ unsigned int flags);
+
+
/**
* VIR_DOMAIN_CPU_STATS_CPUTIME:
* cpu usage (sum of both vcpu and hypervisor usage) in nanoseconds,
diff --git a/src/driver-hypervisor.h b/src/driver-hypervisor.h
index eef31eb1..2b3fe725 100644
--- a/src/driver-hypervisor.h
+++ b/src/driver-hypervisor.h
@@ -220,6 +220,12 @@ typedef int
int *reason,
unsigned int flags);
+typedef int
+(*virDrvDomainGetStateParams)(virDomainPtr domain,
+ virTypedParameterPtr *params,
+ int *nparams,
+ unsigned int flags);
+
typedef int
(*virDrvDomainGetControlInfo)(virDomainPtr domain,
virDomainControlInfoPtr info,
@@ -1383,6 +1389,7 @@ struct _virHypervisorDriver {
virDrvDomainGetBlkioParameters domainGetBlkioParameters;
virDrvDomainGetInfo domainGetInfo;
virDrvDomainGetState domainGetState;
+ virDrvDomainGetStateParams domainGetStateParams;
virDrvDomainGetControlInfo domainGetControlInfo;
virDrvDomainSave domainSave;
virDrvDomainSaveFlags domainSaveFlags;
diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c
index ab7266dc..78d95bf6 100644
--- a/src/libvirt-domain.c
+++ b/src/libvirt-domain.c
@@ -2502,6 +2502,62 @@ virDomainGetState(virDomainPtr domain,
}
+/**
+ * virDomainGetStateParams:
+ * @domain: a domain object
+ * @params: where to store domain statistics, must be freed by the caller
+ * @nparams: number of items in @params
+ * @flags: bitwise-OR of virDomainGetStateFlags,
+ * not currently used yet, callers should always pass 0
+ *
+ * Extract domain state. Each state is accompanied by a reason (if known)
+ * and optional detailed information.
+ *
+ * Possible fields returned in @params are defined by VIR_DOMAIN_STATE_PARAMS_*
+ * macros and new fields will likely be introduced in the future so callers
+ * may receive fields that they do not understand in case they talk to a newer
+ * server. The caller is responsible to free allocated memory returned in
+ * @params by calling virTypedParamsFree.
+ *
+ * Returns 0 in case of success and -1 in case of failure.
+ */
+int
+virDomainGetStateParams(virDomainPtr domain,
+ virTypedParameterPtr *params,
+ int *nparams,
+ unsigned int flags)
+{
+ virConnectPtr conn;
+
+ VIR_DOMAIN_DEBUG(domain, "params=%p, nparams=%p, flags=0x%x",
+ params, nparams, flags);
+
+ virResetLastError();
+
+ virCheckDomainReturn(domain, -1);
+ virCheckNonNullArgGoto(params, error);
+ virCheckNonNullArgGoto(nparams, error);
+
+ conn = domain->conn;
+ if (conn->driver->domainGetStateParams) {
+ int ret;
+ ret = conn->driver->domainGetStateParams(domain,
+ params,
+ nparams,
+ flags);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virReportUnsupportedError();
+
+ error:
+ virDispatchError(domain->conn);
+ return -1;
+}
+
+
/**
* virDomainGetControlInfo:
* @domain: a domain object
diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms
index d4cdbd8b..866c2e99 100644
--- a/src/libvirt_public.syms
+++ b/src/libvirt_public.syms
@@ -809,4 +809,9 @@ LIBVIRT_4.5.0 {
virNWFilterBindingGetFilterName;
} LIBVIRT_4.4.0;
+LIBVIRT_4.6.0 {
+ global:
+ virDomainGetStateParams;
+} LIBVIRT_4.5.0;
+
# .... define new API here using predicted next version number ....
--
2.17.0