]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Add managed save API entry points
authorDaniel Veillard <veillard@redhat.com>
Thu, 1 Apr 2010 08:46:28 +0000 (10:46 +0200)
committerDaniel Veillard <veillard@redhat.com>
Sun, 4 Apr 2010 09:07:48 +0000 (11:07 +0200)
virDomainManagedSave() is to be run on a running domain. Once the call
complete, as in virDomainSave() the domain is stopped upon completion,
but there is no restore counterpart as any order to start the domain
from the API would load the state from the managed file, similary if
the domain is autostarted when libvirtd starts.
Once a domain has restarted his managed save image is destroyed,
basically managed save image can only exist for a stopped domain,
for a running domain that would be by definition outdated data.

* include/libvirt/libvirt.h.in src/libvirt.c src/libvirt_public.syms:
  adds the new entry points virDomainManagedSave(),
  virDomainHasManagedSaveImage() and virDomainManagedSaveRemove()
* src/driver.h src/esx/esx_driver.c src/lxc/lxc_driver.c
  src/opennebula/one_driver.c  src/openvz/openvz_driver.c
  src/phyp/phyp_driver.c src/qemu/qemu_driver.c src/vbox/vbox_tmpl.c
  src/remote/remote_driver.c src/test/test_driver.c src/uml/uml_driver.c
  src/xen/xen_driver.c: add corresponding new internal drivers entry
  points

15 files changed:
include/libvirt/libvirt.h.in
src/driver.h
src/esx/esx_driver.c
src/libvirt.c
src/libvirt_public.syms
src/lxc/lxc_driver.c
src/opennebula/one_driver.c
src/openvz/openvz_driver.c
src/phyp/phyp_driver.c
src/qemu/qemu_driver.c
src/remote/remote_driver.c
src/test/test_driver.c
src/uml/uml_driver.c
src/vbox/vbox_tmpl.c
src/xen/xen_driver.c

index 7cb483e76e7615873bc2db3ba24a4c92e3eade39..a9be8798f6bfd7d1db0242dea547fe9c801b70ef 100644 (file)
@@ -638,6 +638,16 @@ int                     virDomainSave           (virDomainPtr domain,
 int                     virDomainRestore        (virConnectPtr conn,
                                                  const char *from);
 
+/*
+ * Managed domain save
+ */
+int                    virDomainManagedSave     (virDomainPtr dom,
+                                                 unsigned int flags);
+int                    virDomainHasManagedSaveImage(virDomainPtr dom,
+                                                 unsigned int flags);
+int                    virDomainManagedSaveRemove(virDomainPtr dom,
+                                                 unsigned int flags);
+
 /*
  * Domain core dump
  */
index 8f864638c73f7b6069230907a2d02ccbe20725f6..7e2536d3c4b1aeafe7df63b02a71634dcf122c47 100644 (file)
@@ -402,6 +402,15 @@ typedef int
     (*virDrvDomainEventDeregisterAny)(virConnectPtr conn,
                                       int callbackID);
 
+typedef int
+    (*virDrvDomainManagedSave)(virDomainPtr domain, unsigned int flags);
+
+typedef int
+    (*virDrvDomainHasManagedSaveImage)(virDomainPtr domain, unsigned int flags);
+
+typedef int
+    (*virDrvDomainManagedSaveRemove)(virDomainPtr domain, unsigned int flags);
+
 /**
  * _virDriver:
  *
@@ -499,6 +508,9 @@ struct _virDriver {
     virDrvDomainMigrateSetMaxDowntime  domainMigrateSetMaxDowntime;
     virDrvDomainEventRegisterAny domainEventRegisterAny;
     virDrvDomainEventDeregisterAny domainEventDeregisterAny;
+    virDrvDomainManagedSave domainManagedSave;
+    virDrvDomainHasManagedSaveImage domainHasManagedSaveImage;
+    virDrvDomainManagedSaveRemove domainManagedSaveRemove;
 };
 
 typedef int
index 7a92c4dc4b571c425cd4e03030e12802243160b0..e55c948724592ed4921f3ced69a649aceb72bc25 100644 (file)
@@ -3389,6 +3389,9 @@ static virDriver esxDriver = {
     NULL, /* domainMigrateSetMaxDowntime */
     NULL, /* domainEventRegisterAny */
     NULL, /* domainEventDeregisterAny */
+    NULL, /* domainManagedSave */
+    NULL, /* domainHasManagedSaveImage */
+    NULL, /* domainManagedSaveRemove */
 };
 
 
index 5247fe726579bb6a420e9105e49cb46d3252df58..fb683c0a73e3fc45b56305ea0fad5ae96e7643e4 100644 (file)
@@ -12136,3 +12136,143 @@ error:
     virDispatchError(conn);
     return -1;
 }
+
+/**
+ * virDomainManagedSave:
+ * @dom: pointer to the domain
+ * @flags: optional flags currently unused
+ *
+ * This method will suspend a domain and save its memory contents to
+ * a file on disk. After the call, if successful, the domain is not
+ * listed as running anymore.
+ * The difference from virDomainSave() is that libvirt is keeping track of
+ * the saved state itself, and will reuse it once the domain is being
+ * restarted (automatically or via an explicit libvirt call).
+ * As a result any running domain is sure to not have a managed saved image.
+ *
+ * Returns 0 in case of success or -1 in case of failure
+ */
+int virDomainManagedSave(virDomainPtr dom, unsigned int flags)
+{
+    virConnectPtr conn;
+
+    VIR_DEBUG("dom=%p, flags=%u", dom, flags);
+
+    virResetLastError();
+
+    if (!VIR_IS_CONNECTED_DOMAIN(dom)) {
+        virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+        virDispatchError(NULL);
+        return -1;
+    }
+
+    conn = dom->conn;
+    if (conn->flags & VIR_CONNECT_RO) {
+        virLibDomainError(dom, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
+        goto error;
+    }
+
+    if (conn->driver->domainManagedSave) {
+        int ret;
+
+        ret = conn->driver->domainManagedSave(dom, flags);
+        if (ret < 0)
+            goto error;
+        return ret;
+    }
+
+    virLibConnError(conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+    virDispatchError(conn);
+    return -1;
+}
+
+/**
+ * virDomainHasManagedSaveImage:
+ * @dom: pointer to the domain
+ * @flags: optional flags currently unused
+ *
+ * Check if a domain has a managed save image as created by
+ * virDomainManagedSave(). Note that any running domain should not have
+ * such an image, as it should have been removed on restart.
+ *
+ * Returns 0 if no image is present, 1 if an image is present, and
+ *         -1 in case of error
+ */
+int virDomainHasManagedSaveImage(virDomainPtr dom, unsigned int flags)
+{
+    virConnectPtr conn;
+
+    VIR_DEBUG("dom=%p, flags=%u", dom, flags);
+
+    virResetLastError();
+
+    if (!VIR_IS_CONNECTED_DOMAIN(dom)) {
+        virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+        virDispatchError(NULL);
+        return -1;
+    }
+
+    conn = dom->conn;
+
+    if (conn->driver->domainHasManagedSaveImage) {
+        int ret;
+
+        ret = conn->driver->domainHasManagedSaveImage(dom, flags);
+        if (ret < 0)
+            goto error;
+        return ret;
+    }
+
+    virLibConnError(conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+    virDispatchError(conn);
+    return -1;
+}
+
+/**
+ * virDomainManagedSaveRemove:
+ * @dom: pointer to the domain
+ * @flags: optional flags currently unused
+ *
+ * Remove any managed save image as for this domain.
+ *
+ * Returns 0 in case of success, and -1 in case of error
+ */
+int virDomainManagedSaveRemove(virDomainPtr dom, unsigned int flags)
+{
+    virConnectPtr conn;
+
+    VIR_DEBUG("dom=%p, flags=%u", dom, flags);
+
+    virResetLastError();
+
+    if (!VIR_IS_CONNECTED_DOMAIN(dom)) {
+        virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+        virDispatchError(NULL);
+        return -1;
+    }
+
+    conn = dom->conn;
+    if (conn->flags & VIR_CONNECT_RO) {
+        virLibDomainError(dom, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
+        goto error;
+    }
+
+    if (conn->driver->domainManagedSaveRemove) {
+        int ret;
+
+        ret = conn->driver->domainManagedSaveRemove(dom, flags);
+        if (ret < 0)
+            goto error;
+        return ret;
+    }
+
+    virLibConnError(conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+    virDispatchError(conn);
+    return -1;
+}
index 2f812a15850cf9ac09868b34146cf518cbd7a7d8..24a422fc63264744ee38b15c255a2aa44f995857 100644 (file)
@@ -378,6 +378,9 @@ LIBVIRT_0.7.8 {
        virNWFilterRef;
        virNWFilterDefineXML;
        virNWFilterUndefine;
+       virDomainManagedSave;
+       virDomainHasManagedSaveImage;
+       virDomainManagedSaveRemove;
 } LIBVIRT_0.7.7;
 
 
index 9caefa13a43a95d866b9563c9720124c1966beaf..01330ec352bfff7027c2edc114f20f0952754eec 100644 (file)
@@ -2538,6 +2538,9 @@ static virDriver lxcDriver = {
     NULL, /* domainMigrateSetMaxDowntime */
     lxcDomainEventRegisterAny, /* domainEventRegisterAny */
     lxcDomainEventDeregisterAny, /* domainEventDeregisterAny */
+    NULL, /* domainManagedSave */
+    NULL, /* domainHasManagedSaveImage */
+    NULL, /* domainManagedSaveRemove */
 };
 
 static virStateDriver lxcStateDriver = {
index e901a03fa39fd4f5a0fff6c9162b3905413c12de..91d7459cd9329ce272aad9c0417f14f248b0d63f 100644 (file)
@@ -792,6 +792,9 @@ static virDriver oneDriver = {
     NULL, /* domainMigrateSetMaxDowntime */
     NULL, /* domainEventRegisterAny */
     NULL, /* domainEventDeregisterAny */
+    NULL, /* domainManagedSave */
+    NULL, /* domainHasManagedSaveImage */
+    NULL, /* domainManagedSaveRemove */
 };
 
 static virStateDriver oneStateDriver = {
index 61765771f1f7816b1ccecc4c2c7882d7cdbcde67..32bc3c2e705a7b3dea50fc986d12b74afb35bf0b 100644 (file)
@@ -1544,6 +1544,9 @@ static virDriver openvzDriver = {
     NULL, /* domainMigrateSetMaxDowntime */
     NULL, /* domainEventRegisterAny */
     NULL, /* domainEventDeregisterAny */
+    NULL, /* domainManagedSave */
+    NULL, /* domainHasManagedSaveImage */
+    NULL, /* domainManagedSaveRemove */
 };
 
 int openvzRegister(void) {
index 4f7efdbb4867ab484375a4cccea30afda0848970..0e1d35fa01b8b1f7450bcc443674a912dc69651e 100644 (file)
@@ -1651,6 +1651,9 @@ virDriver phypDriver = {
     NULL, /* domainMigrateSetMaxDowntime */
     NULL, /* domainEventRegisterAny */
     NULL, /* domainEventDeregisterAny */
+    NULL, /* domainManagedSave */
+    NULL, /* domainHasManagedSaveImage */
+    NULL, /* domainManagedSaveRemove */
 };
 
 int
index 70d2781ef7957cc83f0b6c432b979aab72c96130..94f7fef5227cfcd6d7950ee05863b4880733b86d 100644 (file)
@@ -10312,6 +10312,9 @@ static virDriver qemuDriver = {
     qemuDomainMigrateSetMaxDowntime, /* domainMigrateSetMaxDowntime */
     qemuDomainEventRegisterAny, /* domainEventRegisterAny */
     qemuDomainEventDeregisterAny, /* domainEventDeregisterAny */
+    NULL, /* domainManagedSave */
+    NULL, /* domainHasManagedSaveImage */
+    NULL, /* domainManagedSaveRemove */
 };
 
 
index 3b8be2159dd23de96902fd489c6a47a5e1b878ba..9b500d0901f53d029f051195ad23ec550583d5f6 100644 (file)
@@ -9818,6 +9818,9 @@ static virDriver remote_driver = {
     remoteDomainMigrateSetMaxDowntime, /* domainMigrateSetMaxDowntime */
     remoteDomainEventRegisterAny, /* domainEventRegisterAny */
     remoteDomainEventDeregisterAny, /* domainEventDeregisterAny */
+    NULL, /* domainManagedSave */
+    NULL, /* domainHasManagedSaveImage */
+    NULL, /* domainManagedSaveRemove */
 };
 
 static virNetworkDriver network_driver = {
index 646c7db51949cd9f4151ed83c732af0c106b7448..105f8250c4e98fcdc33443cb4a03f964db88a616 100644 (file)
@@ -5306,6 +5306,9 @@ static virDriver testDriver = {
     NULL, /* domainMigrateSetMaxDowntime */
     testDomainEventRegisterAny, /* domainEventRegisterAny */
     testDomainEventDeregisterAny, /* domainEventDeregisterAny */
+    NULL, /* domainManagedSave */
+    NULL, /* domainHasManagedSaveImage */
+    NULL, /* domainManagedSaveRemove */
 };
 
 static virNetworkDriver testNetworkDriver = {
index 08fbf930bd791149189c0f16335e13b4a3401c17..443d82ed900f176fefe28e05199c5c360f7df0e0 100644 (file)
@@ -1937,6 +1937,9 @@ static virDriver umlDriver = {
     NULL, /* domainMigrateSetMaxDowntime */
     NULL, /* domainEventRegisterAny */
     NULL, /* domainEventDeregisterAny */
+    NULL, /* domainManagedSave */
+    NULL, /* domainHasManagedSaveImage */
+    NULL, /* domainManagedSaveRemove */
 };
 
 
index 59ad1b8ad7d4c3ac738d10edbf7d3e8b184c7dec..8450266003693fffcefbea2fc114f9a21ab64cba 100644 (file)
@@ -7184,6 +7184,9 @@ virDriver NAME(Driver) = {
     vboxDomainEventRegisterAny, /* domainEventRegisterAny */
     vboxDomainEventDeregisterAny, /* domainEventDeregisterAny */
 #endif
+    NULL, /* domainManagedSave */
+    NULL, /* domainHasManagedSaveImage */
+    NULL, /* domainManagedSaveRemove */
 };
 
 virNetworkDriver NAME(NetworkDriver) = {
index ebdc6009e66de61cf00f0d1a12670bc3b2508f8b..a5d58d0418316644fab1d2094692811f4ef74d61 100644 (file)
@@ -1980,6 +1980,9 @@ static virDriver xenUnifiedDriver = {
     NULL, /* domainMigrateSetMaxDowntime */
     xenUnifiedDomainEventRegisterAny, /* domainEventRegisterAny */
     xenUnifiedDomainEventDeregisterAny, /* domainEventDeregisterAny */
+    NULL, /* domainManagedSave */
+    NULL, /* domainHasManagedSaveImage */
+    NULL, /* domainManagedSaveRemove */
 };
 
 /**