On Wed, 2014-04-02 at 15:52 +0200, Daniel P. Berrange wrote:
On Wed, Apr 02, 2014 at 03:35:51PM +0200, Cédric Bosdonnat wrote:
> This uses the dbus api of systemd to check the power management
> capabilities of the node.
> ---
> Diff with v2:
> * Fixed a few dbus call problems
>
> configure.ac | 11 +++++++++
> libvirt.spec.in | 9 ++++++++
> src/libvirt_private.syms | 3 +++
> src/util/virnodesuspend.c | 32 +++++++++++++++++++++++++
> src/util/virsystemd.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++
> src/util/virsystemd.h | 6 +++++
> 6 files changed, 120 insertions(+)
Could you also add a test to tests/virsystemdtest.c to exercuse
these hekper APIs.
Will do it.
> diff --git a/src/util/virnodesuspend.c
b/src/util/virnodesuspend.c
> index 8088931..ba4a338 100644
> --- a/src/util/virnodesuspend.c
> +++ b/src/util/virnodesuspend.c
> @@ -22,6 +22,9 @@
> #include <config.h>
> #include "virnodesuspend.h"
>
> +#ifndef WITH_PM_UTILS
> +# include "virsystemd.h"
> +#endif
> #include "vircommand.h"
> #include "virthread.h"
> #include "datatypes.h"
> @@ -260,6 +263,7 @@ int nodeSuspendForDuration(unsigned int target,
> *
> * Returns 0 if the query was successful, -1 on failure.
> */
> +#ifdef WITH_PM_UTILS
> static int
> virNodeSuspendSupportsTarget(unsigned int target, bool *supported)
> {
> @@ -300,6 +304,34 @@ virNodeSuspendSupportsTarget(unsigned int target, bool
*supported)
> virCommandFree(cmd);
> return ret;
> }
> +#else /* ! WITH_PM_UTILS */
> +static int
> +virNodeSuspendSupportsTarget(unsigned int target, bool *supported)
> +{
> + int ret = -1;
> +
> + if (virNodeSuspendInitialize() < 0)
> + return -1;
> +
> + *supported = false;
> +
> + switch (target) {
> + case VIR_NODE_SUSPEND_TARGET_MEM:
> + ret = virSystemdCanSuspend(supported);
> + break;
> + case VIR_NODE_SUSPEND_TARGET_DISK:
> + ret = virSystemdCanHibernate(supported);
> + break;
> + case VIR_NODE_SUSPEND_TARGET_HYBRID:
> + ret = virSystemdCanHybridSleep(supported);
> + break;
> + default:
> + return ret;
> + }
> +
> + return ret;
> +}
> +#endif /* WITH_PM_UTILS */
Rather than having a hardcoded choice of pm-utils vs systemd
I think we should check if the systemd service is running and
if so use it, otherwise fallback to pm-utils. That way if
someone has systemd installed, but is not running it as their
init, things would still work
The idea is also to be able to drop the Requires: pm-utils in the spec
file... so a runtime check wouldn't help this.
--
Cedric