[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[libvirt] [PATCH RFC 3/4] Create new virDrvDomainSuspendFlags API



define these flags:

   VIR_DOMAIN_SUSPEND_SLEEP     = 0,        /* Suspend to RAM */
   VIR_DOMAIN_SUSPEND_HIBERNATE = (1 << 0), /* Suspend to disk */
---
 include/libvirt/libvirt.h.in |    8 ++++++
 src/driver.h                 |    4 +++
 src/libvirt.c                |   55 ++++++++++++++++++++++++++++++++++++++++++
 src/libvirt_public.syms      |    1 +
 src/remote/remote_driver.c   |    1 +
 src/remote/remote_protocol.x |    9 ++++++-
 src/remote_protocol-structs  |    5 ++++
 7 files changed, 82 insertions(+), 1 deletions(-)

diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in
index e99cd00..d5ac891 100644
--- a/include/libvirt/libvirt.h.in
+++ b/include/libvirt/libvirt.h.in
@@ -1233,6 +1233,14 @@ int                     virDomainFree           (virDomainPtr domain);
 int                     virDomainSuspend        (virDomainPtr domain);
 int                     virDomainResume         (virDomainPtr domain);
 
+typedef enum {
+    VIR_DOMAIN_SUSPEND_SLEEP     = 0,        /* Suspend to RAM */
+    VIR_DOMAIN_SUSPEND_HIBERNATE = (1 << 0), /* Suspend to disk */
+} virDomainSuspendFlagValues;
+
+int                     virDomainSuspendFlags   (virDomainPtr domain,
+                                                 unsigned int flags);
+
 /*
  * Domain save/restore
  */
diff --git a/src/driver.h b/src/driver.h
index df2aa60..2b878dd 100644
--- a/src/driver.h
+++ b/src/driver.h
@@ -118,6 +118,9 @@ typedef virDomainPtr
 typedef int
         (*virDrvDomainSuspend)		(virDomainPtr domain);
 typedef int
+        (*virDrvDomainSuspendFlags) (virDomainPtr domain,
+                                     unsigned int flags);
+typedef int
         (*virDrvDomainResume)		(virDomainPtr domain);
 typedef int
         (*virDrvDomainShutdown)		(virDomainPtr domain);
@@ -831,6 +834,7 @@ struct _virDriver {
     virDrvDomainLookupByUUID	domainLookupByUUID;
     virDrvDomainLookupByName	domainLookupByName;
     virDrvDomainSuspend		domainSuspend;
+    virDrvDomainSuspendFlags domainSuspendFlags;
     virDrvDomainResume		domainResume;
     virDrvDomainShutdown		domainShutdown;
     virDrvDomainShutdownFlags   domainShutdownFlags;
diff --git a/src/libvirt.c b/src/libvirt.c
index 8be4e13..f94a5b9 100644
--- a/src/libvirt.c
+++ b/src/libvirt.c
@@ -2387,6 +2387,61 @@ error:
 }
 
 /**
+ * virDomainSuspendFlags:
+ * @domain: a domain object
+ * @flags: an OR'ed set of virDomainSuspendFlagValues
+ *
+ * Suspends an active domain. Dependent of @flags passed,
+ * the domain will enter either S3 or S4 state.
+ * Use VIR_DOMAIN_SUSPEND_SLEEP for S4, and
+ * VIR_DOMAIN_SUSPEND_HIBERNATE for S4.
+ *
+ * This function may require privileged access.
+ *
+ * Moreover, on some hypervisors, like QEMU, this may
+ * requires guest agent to be configured and running
+ * inside the domain.
+ *
+ * Returns 0 in case of success and -1 in case of failure.
+ */
+int
+virDomainSuspendFlags(virDomainPtr domain,
+                      unsigned int flags)
+{
+    virConnectPtr conn;
+
+    VIR_DOMAIN_DEBUG(domain);
+
+    virResetLastError();
+
+    if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
+        virLibDomainError(VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+        virDispatchError(NULL);
+        return -1;
+    }
+    if (domain->conn->flags & VIR_CONNECT_RO) {
+        virLibDomainError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
+        goto error;
+    }
+
+    conn = domain->conn;
+
+    if (conn->driver->domainSuspendFlags) {
+        int ret;
+        ret = conn->driver->domainSuspendFlags(domain, flags);
+        if (ret < 0)
+            goto error;
+        return ret;
+    }
+
+    virLibConnError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+    virDispatchError(domain->conn);
+    return -1;
+}
+
+/**
  * virDomainResume:
  * @domain: a domain object
  *
diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms
index b7f1944..4289ccf 100644
--- a/src/libvirt_public.syms
+++ b/src/libvirt_public.syms
@@ -520,6 +520,7 @@ LIBVIRT_0.9.10 {
     global:
         virDomainShutdownFlags;
         virStorageVolWipePattern;
+        virDomainSuspendFlags;
 } LIBVIRT_0.9.9;
 
 # .... define new API here using predicted next version number ....
diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
index f79f53e..ed5772f 100644
--- a/src/remote/remote_driver.c
+++ b/src/remote/remote_driver.c
@@ -4615,6 +4615,7 @@ static virDriver remote_driver = {
     .domainLookupByUUID = remoteDomainLookupByUUID, /* 0.3.0 */
     .domainLookupByName = remoteDomainLookupByName, /* 0.3.0 */
     .domainSuspend = remoteDomainSuspend, /* 0.3.0 */
+    .domainSuspendFlags = remoteDomainSuspendFlags, /* 0.9.10 */
     .domainResume = remoteDomainResume, /* 0.3.0 */
     .domainShutdown = remoteDomainShutdown, /* 0.3.0 */
     .domainShutdownFlags = remoteDomainShutdownFlags, /* 0.9.10 */
diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x
index 0f354bb..d298a03 100644
--- a/src/remote/remote_protocol.x
+++ b/src/remote/remote_protocol.x
@@ -732,6 +732,11 @@ struct remote_domain_suspend_args {
     remote_nonnull_domain dom;
 };
 
+struct remote_domain_suspend_flags_args {
+    remote_nonnull_domain dom;
+    unsigned int flags;
+};
+
 struct remote_domain_resume_args {
     remote_nonnull_domain dom;
 };
@@ -2667,7 +2672,9 @@ enum remote_procedure {
     REMOTE_PROC_DOMAIN_SET_INTERFACE_PARAMETERS = 256, /* autogen autogen */
     REMOTE_PROC_DOMAIN_GET_INTERFACE_PARAMETERS = 257, /* skipgen skipgen */
     REMOTE_PROC_DOMAIN_SHUTDOWN_FLAGS = 258, /* autogen autogen */
-    REMOTE_PROC_STORAGE_VOL_WIPE_PATTERN = 259 /* autogen autogen */
+    REMOTE_PROC_STORAGE_VOL_WIPE_PATTERN = 259, /* autogen autogen */
+
+    REMOTE_PROC_DOMAIN_SUSPEND_FLAGS = 260 /* autogen autogen */
 
     /*
      * Notice how the entries are grouped in sets of 10 ?
diff --git a/src/remote_protocol-structs b/src/remote_protocol-structs
index de85862..dc47038 100644
--- a/src/remote_protocol-structs
+++ b/src/remote_protocol-structs
@@ -440,6 +440,10 @@ struct remote_domain_lookup_by_name_ret {
 struct remote_domain_suspend_args {
         remote_nonnull_domain      dom;
 };
+struct remote_domain_suspend_flags_args {
+        remote_nonnull_domain      dom;
+        u_int                      flags;
+};
 struct remote_domain_resume_args {
         remote_nonnull_domain      dom;
 };
@@ -2101,4 +2105,5 @@ enum remote_procedure {
         REMOTE_PROC_DOMAIN_GET_INTERFACE_PARAMETERS = 257,
         REMOTE_PROC_DOMAIN_SHUTDOWN_FLAGS = 258,
         REMOTE_PROC_STORAGE_VOL_WIPE_PATTERN = 259,
+        REMOTE_PROC_DOMAIN_SUSPEND_FLAGS = 260,
 };
-- 
1.7.3.4


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]