[libvirt] [libvirt-glib] [PATCH v3 2/4] GVirDomainSnapshot: Add async version of _revert_to
--- libvirt-gobject/libvirt-gobject-domain-snapshot.c | 59 +++ libvirt-gobject/libvirt-gobject-domain-snapshot.h | 11 + libvirt-gobject/libvirt-gobject.sym | 2 + 3 files changed, 72 insertions(+) diff --git a/libvirt-gobject/libvirt-gobject-domain-snapshot.c b/libvirt-gobject/libvirt-gobject-domain-snapshot.c index 62efce0..4e74f92 100644 --- a/libvirt-gobject/libvirt-gobject-domain-snapshot.c +++ b/libvirt-gobject/libvirt-gobject-domain-snapshot.c @@ -302,6 +302,65 @@ gboolean gvir_domain_snapshot_revert_to(GVirDomainSnapshot *snapshot, return TRUE; } +static void _revert_to_async_thread(GTask *task, +gpointer source_object, +gpointer task_data, +GCancellable *cancellable) { +GError *error = NULL; +gboolean status; + +status = gvir_domain_snapshot_revert_to(source_object, +GPOINTER_TO_UINT(task_data), +&error); + +if (status) +g_task_return_boolean(task, TRUE); +else +g_task_return_error(task, error); +} + + +/** + * gvir_domain_snapshot_revert_to_async: + * @snapshot: A #GVirDomainSnapshot + * @flags: Bitwise OR of #GVirDomainSnapshotRevertFlags + * @cancellable: (allow-none) (transfer none): cancellation object + * @callback: (scope async): The callback + * @user_data: (closure): Opaque data for callback + */ +void gvir_domain_snapshot_revert_to_async(GVirDomainSnapshot *snapshot, + guint flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) { +GTask *task; + +g_return_if_fail(GVIR_IS_DOMAIN_SNAPSHOT(snapshot)); + +task = g_task_new(snapshot, cancellable, callback, user_data); +g_task_set_task_data(task, GUINT_TO_POINTER(flags), NULL); +g_task_run_in_thread(task, _revert_to_async_thread); +g_object_unref(task); +} + + + +/** + * gvir_domain_snapshot_revert_to_finish: + * @snapshot: The domain snapshot + * @result: (transfer none): The result + * + * Returns: %TRUE on success, %FALSE otherwise. + */ +gboolean gvir_domain_snapshot_revert_to_finish(GVirDomainSnapshot *snapshot, + GAsyncResult *result, + GError **error) { +g_return_val_if_fail(GVIR_IS_DOMAIN_SNAPSHOT(snapshot), FALSE); +g_return_val_if_fail(g_task_is_valid(result, snapshot), FALSE); + +return g_task_propagate_boolean(G_TASK(result), error); +} + /** diff --git a/libvirt-gobject/libvirt-gobject-domain-snapshot.h b/libvirt-gobject/libvirt-gobject-domain-snapshot.h index 5ab3025..b1dcf20 100644 --- a/libvirt-gobject/libvirt-gobject-domain-snapshot.h +++ b/libvirt-gobject/libvirt-gobject-domain-snapshot.h @@ -107,6 +107,17 @@ gboolean gvir_domain_snapshot_revert_to(GVirDomainSnapshot *snapshot, guint flags, GError **error); +void gvir_domain_snapshot_revert_to_async(GVirDomainSnapshot *snapshot, + guint flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +gboolean gvir_domain_snapshot_revert_to_finish(GVirDomainSnapshot *snapshot, + GAsyncResult *result, + GError **error); + + gboolean gvir_domain_snapshot_set_config(GVirDomainSnapshot *snapshot, GVirConfigDomainSnapshot *conf, GError **error); diff --git a/libvirt-gobject/libvirt-gobject.sym b/libvirt-gobject/libvirt-gobject.sym index 68e9b58..ebb9418 100644 --- a/libvirt-gobject/libvirt-gobject.sym +++ b/libvirt-gobject/libvirt-gobject.sym @@ -247,6 +247,8 @@ LIBVIRT_GOBJECT_0.1.9 { gvir_domain_snapshot_list_flags_get_type; gvir_domain_snapshot_revert_flags_get_type; gvir_domain_snapshot_revert_to; + gvir_domain_snapshot_revert_to_async; + gvir_domain_snapshot_revert_to_finish; gvir_domain_snapshot_set_config; gvir_storage_pool_state_get_type; gvir_storage_vol_resize_flags_get_type; -- 2.1.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [libvirt-glib] [PATCH v2 2/4] GVirDomainSnapshot: Add async version of _revert_to
--- libvirt-gobject/libvirt-gobject-domain-snapshot.c | 59 +++ libvirt-gobject/libvirt-gobject-domain-snapshot.h | 11 + libvirt-gobject/libvirt-gobject.sym | 2 + 3 files changed, 72 insertions(+) diff --git a/libvirt-gobject/libvirt-gobject-domain-snapshot.c b/libvirt-gobject/libvirt-gobject-domain-snapshot.c index b071c5b..0dcbecc 100644 --- a/libvirt-gobject/libvirt-gobject-domain-snapshot.c +++ b/libvirt-gobject/libvirt-gobject-domain-snapshot.c @@ -304,6 +304,65 @@ gboolean gvir_domain_snapshot_revert_to(GVirDomainSnapshot *snapshot, return TRUE; } +static void _revert_to_async_thread(GTask *task, +gpointer source_object, +gpointer task_data, +GCancellable *cancellable) { +GError *error = NULL; +gboolean status; + +status = gvir_domain_snapshot_revert_to(source_object, +GPOINTER_TO_UINT(task_data), +cancellable, +&error); + +if (status) +g_task_return_boolean(task, TRUE); +else +g_task_return_error(task, error); +} + + +/** + * gvir_domain_snapshot_revert_to_async: + * @snapshot: A #GVirDomainSnapshot + * @cancellable: (allow-none) (transfer none): cancellation object + * @callback: (scope async): The callback + * @user_data: (closure): Opaque data for callback + */ +void gvir_domain_snapshot_revert_to_async(GVirDomainSnapshot *snapshot, + guint flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) { +GTask *task; + +g_return_if_fail(GVIR_IS_DOMAIN_SNAPSHOT(snapshot)); + +task = g_task_new(snapshot, cancellable, callback, user_data); +g_task_set_task_data(task, GUINT_TO_POINTER(flags), NULL); +g_task_run_in_thread(task, _revert_to_async_thread); +g_object_unref(task); +} + + + +/** + * gvir_domain_snapshot_revert_to_finished: + * @snapshot: The domain snapshot + * @result: (transfer none): The result + * + * Returns: %TRUE on success, %FALSE otherwise. + */ +gboolean gvir_domain_snapshot_revert_to_finish(GVirDomainSnapshot *snapshot, + GAsyncResult *result, + GError **error) { +g_return_val_if_fail(GVIR_IS_DOMAIN_SNAPSHOT(snapshot), FALSE); +g_return_val_if_fail(g_task_is_valid(result, snapshot), FALSE); + +return g_task_propagate_boolean(G_TASK(result), error); +} + /** diff --git a/libvirt-gobject/libvirt-gobject-domain-snapshot.h b/libvirt-gobject/libvirt-gobject-domain-snapshot.h index 401698a..0f4d31f 100644 --- a/libvirt-gobject/libvirt-gobject-domain-snapshot.h +++ b/libvirt-gobject/libvirt-gobject-domain-snapshot.h @@ -108,6 +108,17 @@ gboolean gvir_domain_snapshot_revert_to(GVirDomainSnapshot *snapshot, GCancellable *cancellable, GError **error); +void gvir_domain_snapshot_revert_to_async(GVirDomainSnapshot *snapshot, + guint flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +gboolean gvir_domain_snapshot_revert_to_finish(GVirDomainSnapshot *snapshot, + GAsyncResult *result, + GError **error); + + gboolean gvir_domain_snapshot_set_config(GVirDomainSnapshot *snapshot, GVirConfigDomainSnapshot *conf, GError **error); diff --git a/libvirt-gobject/libvirt-gobject.sym b/libvirt-gobject/libvirt-gobject.sym index 68e9b58..ebb9418 100644 --- a/libvirt-gobject/libvirt-gobject.sym +++ b/libvirt-gobject/libvirt-gobject.sym @@ -247,6 +247,8 @@ LIBVIRT_GOBJECT_0.1.9 { gvir_domain_snapshot_list_flags_get_type; gvir_domain_snapshot_revert_flags_get_type; gvir_domain_snapshot_revert_to; + gvir_domain_snapshot_revert_to_async; + gvir_domain_snapshot_revert_to_finish; gvir_domain_snapshot_set_config; gvir_storage_pool_state_get_type; gvir_storage_vol_resize_flags_get_type; -- 2.0.4 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [libvirt-glib] [PATCH v2 3/4] GVirDomain: Add async version of _create_snapshot
--- libvirt-gobject/libvirt-gobject-domain.c | 74 libvirt-gobject/libvirt-gobject-domain.h | 12 ++ libvirt-gobject/libvirt-gobject.sym | 2 + 3 files changed, 88 insertions(+) diff --git a/libvirt-gobject/libvirt-gobject-domain.c b/libvirt-gobject/libvirt-gobject-domain.c index aa2a170..0b94f16 100644 --- a/libvirt-gobject/libvirt-gobject-domain.c +++ b/libvirt-gobject/libvirt-gobject-domain.c @@ -61,6 +61,16 @@ enum { LAST_SIGNAL }; +typedef struct { +guint create_flags; +GVirConfigDomainSnapshot *snapshot_config; +} SnapshotCreateData; + +static void snapshot_create_data_free (SnapshotCreateData *data) { +g_clear_object (&data->snapshot_config); +g_slice_free (SnapshotCreateData, data); +} + static gint signals[LAST_SIGNAL]; #define GVIR_DOMAIN_ERROR gvir_domain_error_quark() @@ -1524,6 +1534,70 @@ gvir_domain_create_snapshot(GVirDomain *dom, } +static void _create_snapshot_async_thread(GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) { +GError *error = NULL; +GVirDomainSnapshot *snapshot; +SnapshotCreateData *create_data = task_data; + +snapshot = gvir_domain_create_snapshot(source_object, + create_data->snapshot_config, + create_data->create_flags, + &error); +if (snapshot) +g_task_return_pointer(task, snapshot, g_object_unref); +else +g_task_return_error(task, error); +} + +/** + * gvir_domain_create_snapshot_async: + * @dom: The #GVirDomain + * @custom_conf: (allow-none): Configuration of snapshot or %NULL + * @flags: Bitwise-OR of #GVirDomainSnapshotCreateFlags + * @cancellable: (allow-none) (transfer none): cancellation object + * @callback: (scope async): Complection callback + * @user_data: (closure): Opaque data for callback + */ +void gvir_domain_create_snapshot_async(GVirDomain *dom, + GVirConfigDomainSnapshot *custom_conf, + guint flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) { +SnapshotCreateData *create_data; +GTask *task; + +g_return_if_fail(GVIR_IS_DOMAIN(dom)); +g_return_if_fail(GVIR_CONFIG_IS_DOMAIN_SNAPSHOT(custom_conf)); + +create_data = g_slice_new(SnapshotCreateData); +create_data->create_flags = flags; +create_data->snapshot_config = g_object_ref (custom_conf); + +task = g_task_new(dom, cancellable, callback, user_data); +g_task_set_task_data(task, create_data, (GDestroyNotify)snapshot_create_data_free); +g_task_run_in_thread(task, _create_snapshot_async_thread); +g_object_unref(task); +} + +/** + * gvir_domain_create_snapshot_finish: + * @domain: A #GVirDomain + * @result: (transfer none): Async method result + * @error: (allow-none): Error placeholder + * + * Returns: (transfer full): The created snapshot + */ +GVirDomainSnapshot * gvir_domain_create_snapshot_finish(GVirDomain *domain, +GAsyncResult *result, +GError **error) { +g_return_val_if_fail(g_task_is_valid(result, domain), NULL); + +return g_task_propagate_pointer(G_TASK(result), error); +} /** * gvir_domain_fetch_snapshots: diff --git a/libvirt-gobject/libvirt-gobject-domain.h b/libvirt-gobject/libvirt-gobject-domain.h index 56c80b8..5c48807 100644 --- a/libvirt-gobject/libvirt-gobject-domain.h +++ b/libvirt-gobject/libvirt-gobject-domain.h @@ -363,6 +363,18 @@ gvir_domain_create_snapshot(GVirDomain *dom, guint flags, GError **err); +void gvir_domain_create_snapshot_async(GVirDomain *dom, + GVirConfigDomainSnapshot *custom_conf, + guint flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +GVirDomainSnapshot * gvir_domain_create_snapshot_finish(GVirDomain *domain, +GAsyncResult *result, +GError **error); + + gboolean gvir_domain_fetch_snapshots(GVirDomain *dom, guint list_flags, GCancellable *cancellable, diff --git a/libvirt-gobject/libvirt-gobject.sym b/libvirt-gobject/libvirt-gobject.sym index ebb9418..a610121 100644 --- a/libvirt-gobject/libvir
[libvirt] [libvirt-glib] [PATCH v2 1/4] GVirDomain: Fix some doc comments of the snapshot API
Fixes the following warnings from g-ir-scanner and some cosmetic issues: libvirt-gobject-domain.c:1532: Warning: LibvirtGObject: unknown annotation: transfer-none libvirt-gobject-domain.c:1650: Error: LibvirtGObject: identifier not found on the first line: * ^ --- libvirt-gobject/libvirt-gobject-domain.c | 10 +- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/libvirt-gobject/libvirt-gobject-domain.c b/libvirt-gobject/libvirt-gobject-domain.c index feac6f0..aa2a170 100644 --- a/libvirt-gobject/libvirt-gobject-domain.c +++ b/libvirt-gobject/libvirt-gobject-domain.c @@ -1529,10 +1529,10 @@ gvir_domain_create_snapshot(GVirDomain *dom, * gvir_domain_fetch_snapshots: * @dom: The domain * @list_flags: bitwise-OR of #GVirDomainSnapshotListFlags - * @cancellable: (allow-none)(transfer-none): cancellation object - * @error: (allow-none): Place-holder for error or NULL + * @cancellable: (allow-none) (transfer none): cancellation object + * @error: (allow-none): Place-holder for error or %NULL * - * Returns: TRUE on success, FALSE otherwise. + * Returns: %TRUE on success, %FALSE otherwise. */ gboolean gvir_domain_fetch_snapshots(GVirDomain *dom, guint list_flags, @@ -1647,10 +1647,10 @@ static void _fetch_snapshots_async_thread(GTask *task, /** - * + * gvir_domain_fetch_snapshots_async: * @dom: The domain * @list_flags: bitwise-OR of #GVirDomainSnapshotListFlags - * @cancellable: (allow-none)(transfer-none): cancellation object + * @cancellable: (allow-none) (transfer none): cancellation object * @callback: (scope async): completion callback * @user_data: (closure): opaque data for callback */ -- 2.0.4 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [libvirt-glib] [PATCH v2 4/4] GVirDomainSnapshot: Add async version of _delete
--- libvirt-gobject/libvirt-gobject-domain-snapshot.c | 58 +++ libvirt-gobject/libvirt-gobject-domain-snapshot.h | 10 libvirt-gobject/libvirt-gobject.sym | 2 + 3 files changed, 70 insertions(+) diff --git a/libvirt-gobject/libvirt-gobject-domain-snapshot.c b/libvirt-gobject/libvirt-gobject-domain-snapshot.c index 0dcbecc..9c0d60f 100644 --- a/libvirt-gobject/libvirt-gobject-domain-snapshot.c +++ b/libvirt-gobject/libvirt-gobject-domain-snapshot.c @@ -237,6 +237,64 @@ gboolean gvir_domain_snapshot_delete (GVirDomainSnapshot *snapshot, } + +static void _delete_async_thread(GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) { +GError *error = NULL; +gboolean status; + +status = gvir_domain_snapshot_delete(source_object, + GPOINTER_TO_UINT(task_data), + &error); + +if (status) +g_task_return_boolean(task, TRUE); +else +g_task_return_error(task, error); +} + + +/** + * gvir_domain_snapshot_delete_async: + * @snapshot: A #GVirDomainSnapshot + * @flags: Bitwise-OR of #GVirDomainSnapshotDeleteFlags + * @cancellable: (allow-none) (transfer none): cancellation object + * @callback: (scope async): completion callback + * @user_data: (closure): opaque data for callback + */ +void gvir_domain_snapshot_delete_async(GVirDomainSnapshot *snapshot, + guint flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) { +GTask *task; + +g_return_if_fail(GVIR_IS_DOMAIN_SNAPSHOT(snapshot)); + +task = g_task_new(snapshot, cancellable, callback, user_data); +g_task_set_task_data(task, GUINT_TO_POINTER(flags), NULL); +g_task_run_in_thread(task, _delete_async_thread); +g_object_unref(task); +} + +/** + * gvir_domain_snapshot_delete_finish: + * @snapshot: A #GVirDomainSnapshot + * @res: (transfer none): async method result + * + * Returns: %TRUE on success, %FALSE otherwise. + */ +gboolean gvir_domain_snapshot_delete_finish(GVirDomainSnapshot *snapshot, +GAsyncResult *res, +GError **error) { +g_return_val_if_fail(GVIR_IS_DOMAIN_SNAPSHOT(snapshot), FALSE); +g_return_val_if_fail(g_task_is_valid(res, snapshot), FALSE); + +return g_task_propagate_boolean(G_TASK(res), error); +} + /** * gvir_domain_snapshot_get_is_current: * @snapshot: The domain snapshot diff --git a/libvirt-gobject/libvirt-gobject-domain-snapshot.h b/libvirt-gobject/libvirt-gobject-domain-snapshot.h index 0f4d31f..68bad27 100644 --- a/libvirt-gobject/libvirt-gobject-domain-snapshot.h +++ b/libvirt-gobject/libvirt-gobject-domain-snapshot.h @@ -98,6 +98,16 @@ gboolean gvir_domain_snapshot_delete (GVirDomainSnapshot *snapshot, guint flags, GError **error); +void gvir_domain_snapshot_delete_async(GVirDomainSnapshot *snapshot, + guint flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +gboolean gvir_domain_snapshot_delete_finish(GVirDomainSnapshot *snapshot, +GAsyncResult *res, +GError **error); + gboolean gvir_domain_snapshot_get_is_current(GVirDomainSnapshot *snapshot, guint flags, gboolean *is_current, diff --git a/libvirt-gobject/libvirt-gobject.sym b/libvirt-gobject/libvirt-gobject.sym index a610121..f335399 100644 --- a/libvirt-gobject/libvirt-gobject.sym +++ b/libvirt-gobject/libvirt-gobject.sym @@ -244,6 +244,8 @@ LIBVIRT_GOBJECT_0.1.9 { gvir_domain_get_snapshots; gvir_domain_get_has_current_snapshot; gvir_domain_snapshot_delete; + gvir_domain_snapshot_delete_async; + gvir_domain_snapshot_delete_finish; gvir_domain_snapshot_delete_flags_get_type; gvir_domain_snapshot_get_is_current; gvir_domain_snapshot_list_flags_get_type; -- 2.0.4 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH] GVirDomainSnapshot: Add _revert_to
Add a way to revert a domain to one of its snapshots. --- libvirt-gobject/libvirt-gobject-domain-snapshot.c | 35 +++ libvirt-gobject/libvirt-gobject-domain-snapshot.h | 18 libvirt-gobject/libvirt-gobject.sym | 2 ++ 3 files changed, 55 insertions(+) diff --git a/libvirt-gobject/libvirt-gobject-domain-snapshot.c b/libvirt-gobject/libvirt-gobject-domain-snapshot.c index c53e877..56c9ddb 100644 --- a/libvirt-gobject/libvirt-gobject-domain-snapshot.c +++ b/libvirt-gobject/libvirt-gobject-domain-snapshot.c @@ -268,3 +268,38 @@ gboolean gvir_domain_snapshot_get_is_current(GVirDomainSnapshot *snapshot, return TRUE; } + + + +/** + * gvir_domain_snapshot_revert_to: + * @snapshot: The domain snapshot + * @flags: Bitwise OR of GVirDomainSnapshotRevertFlags + * @cancellable: (allow-none) (transfer none): cancellation object + * @error: (allow-none): Place-holder for error or %NULL + * + * Returns: %TRUE if the snapshot's domain has successfully been + * reverted to the given snapshot, %FALSE otherwise, in which case + * @error will be set. + */ +gboolean gvir_domain_snapshot_revert_to(GVirDomainSnapshot *snapshot, +guint flags, +GCancellable *cancellable, +GError **error) { +int status; + +g_return_val_if_fail(GVIR_IS_DOMAIN_SNAPSHOT(snapshot), FALSE); +g_return_val_if_fail((error == NULL) || (*error == NULL), FALSE); + + +status = virDomainRevertToSnapshot(snapshot->priv->handle, + flags); +if (status != 0) { +gvir_set_error(error, GVIR_DOMAIN_SNAPSHOT_ERROR, + 0, "Failed to revert to snapshot `%s'", + gvir_domain_snapshot_get_name(snapshot)); +return FALSE; +} + +return TRUE; +} diff --git a/libvirt-gobject/libvirt-gobject-domain-snapshot.h b/libvirt-gobject/libvirt-gobject-domain-snapshot.h index 0a0bb96..c67b345 100644 --- a/libvirt-gobject/libvirt-gobject-domain-snapshot.h +++ b/libvirt-gobject/libvirt-gobject-domain-snapshot.h @@ -71,6 +71,19 @@ typedef enum { } GVirDomainSnapshotDeleteFlags; +/** + * GVirDomainSnapshotRevertFlags: + * @GVIR_DOMAIN_SNAPSHOT_REVERT_RUNNING: Run after revert + * @GVIR_DOMAIN_SNAPSHOT_REVERT_PAUSED: Pause after revert + * @GVIR_DOMAIN_SNAPSHOT_REVERT_FORCE: Allow risky reverts + */ +typedef enum { + GVIR_DOMAIN_SNAPSHOT_REVERT_RUNNING = 1, + GVIR_DOMAIN_SNAPSHOT_REVERT_PAUSED = 2, + GVIR_DOMAIN_SNAPSHOT_REVERT_FORCE = 4 +} GVirDomainSnapshotRevertFlags; + + GType gvir_domain_snapshot_get_type(void); GType gvir_domain_snapshot_handle_get_type(void); @@ -89,6 +102,11 @@ gboolean gvir_domain_snapshot_get_is_current(GVirDomainSnapshot *snapshot, guint flags, gboolean *is_current, GError **error); + +gboolean gvir_domain_snapshot_revert_to(GVirDomainSnapshot *snapshot, +guint flags, +GCancellable *cancellable, +GError **error); G_END_DECLS #endif /* __LIBVIRT_GOBJECT_DOMAIN_SNAPSHOT_H__ */ diff --git a/libvirt-gobject/libvirt-gobject.sym b/libvirt-gobject/libvirt-gobject.sym index c740f88..c1c9421 100644 --- a/libvirt-gobject/libvirt-gobject.sym +++ b/libvirt-gobject/libvirt-gobject.sym @@ -244,6 +244,8 @@ LIBVIRT_GOBJECT_0.1.9 { gvir_domain_snapshot_delete_flags_get_type; gvir_domain_snapshot_get_is_current; gvir_domain_snapshot_list_flags_get_type; + gvir_domain_snapshot_revert_flags_get_type; + gvir_domain_snapshot_revert_to; gvir_storage_pool_state_get_type; gvir_storage_vol_resize_flags_get_type; gvir_storage_vol_type_get_type; -- 2.0.4 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [libvirt-glib] [PATCH 1/4] GVirDomain: Fix some doc comments of the snapshot API
On 18.08, Christophe Fergeau wrote: > Hey, > > On Fri, Aug 15, 2014 at 12:05:44PM +0200, Timm Bäder wrote: > > /** > > - * > > + * gvir_domain_fetch_snapshots_async: > > * @dom: The domain > > * @list_flags: bitwise-OR of #GVirDomainSnapshotListFlags > > - * @cancellable: (allow-none)(transfer-none): cancellation object > > + * @cancellable: (allow-none) (transfer none): cancellation object > > Is g-ir-scanner complaining about the lack of space? or just about > 'transfer-none'? Just being curious, patch looks good to me, ACK. For > future commits, c&p-ing the g-ir-scanner warnings that you are fixing in > the commit log can be useful) I'll have to check but IIRC it was mostly about the missing function name on the first line and once I fixed that, it was the transfer-none, yes. The whitespace fixes are just cosmetic. -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [libvirt-glib] [PATCH 3/4] GVirDomain: Add async version of _create_snapshot
--- libvirt-gobject/libvirt-gobject-domain.c | 67 libvirt-gobject/libvirt-gobject-domain.h | 11 ++ libvirt-gobject/libvirt-gobject.sym | 2 + 3 files changed, 80 insertions(+) diff --git a/libvirt-gobject/libvirt-gobject-domain.c b/libvirt-gobject/libvirt-gobject-domain.c index aa2a170..29b82d0 100644 --- a/libvirt-gobject/libvirt-gobject-domain.c +++ b/libvirt-gobject/libvirt-gobject-domain.c @@ -61,6 +61,11 @@ enum { LAST_SIGNAL }; +typedef struct { +guint create_flags; +GVirConfigDomainSnapshot *snapshot_config; +} SnapshotCreateData; + static gint signals[LAST_SIGNAL]; #define GVIR_DOMAIN_ERROR gvir_domain_error_quark() @@ -1524,6 +1529,68 @@ gvir_domain_create_snapshot(GVirDomain *dom, } +static void _create_snapshot_async_thread(GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) { +GError *error = NULL; +GVirDomainSnapshot *snapshot; +SnapshotCreateData *create_data = task_data; + +snapshot = gvir_domain_create_snapshot(source_object, + create_data->snapshot_config, + create_data->create_flags, + &error); +if (snapshot) + g_task_return_pointer(task, snapshot, g_object_unref); +else + g_task_return_error(task, error); +} + +/** + * gvir_domain_create_snapshot_async: + * @dom: The #GVirDomain + * @custom_conf: (allow-none): Configuration of snapshot or %NULL + * @flags: Bitwise-OR of #GVirDomainSnapshotCreateFlags + * @callback: (scope async): Complection callback + * @user_data: (closure): Opaque data for callback + */ +void gvir_domain_create_snapshot_async(GVirDomain *dom, + GVirConfigDomainSnapshot *custom_conf, + guint flags, + GAsyncReadyCallback callback, + gpointer user_data) { +SnapshotCreateData *create_data; +GTask *task; + +g_return_if_fail(GVIR_IS_DOMAIN(dom)); +g_return_if_fail(GVIR_CONFIG_IS_DOMAIN_SNAPSHOT(custom_conf)); + +create_data = g_slice_new(SnapshotCreateData); +create_data->create_flags = flags; +create_data->snapshot_config = custom_conf; + +task = g_task_new(dom, NULL, callback, user_data); +g_task_set_task_data(task, create_data, NULL); +g_task_run_in_thread(task, _create_snapshot_async_thread); +g_object_unref(task); +} + +/** + * gvir_domain_create_snapshot_finish: + * @domain: A #GVirDomain + * @result: (transfer none): Async method result + * @error: (allow-none): Error placeholder + * + * Returns: (transfer full): The created snapshot + */ +GVirDomainSnapshot * gvir_domain_create_snapshot_finish(GVirDomain *domain, +GAsyncResult *result, +GError **error) { +g_return_val_if_fail(g_task_is_valid(result, domain), NULL); + +return g_task_propagate_pointer(G_TASK(result), error); +} /** * gvir_domain_fetch_snapshots: diff --git a/libvirt-gobject/libvirt-gobject-domain.h b/libvirt-gobject/libvirt-gobject-domain.h index 56c80b8..b5a0bd9 100644 --- a/libvirt-gobject/libvirt-gobject-domain.h +++ b/libvirt-gobject/libvirt-gobject-domain.h @@ -363,6 +363,17 @@ gvir_domain_create_snapshot(GVirDomain *dom, guint flags, GError **err); +void gvir_domain_create_snapshot_async(GVirDomain *dom, + GVirConfigDomainSnapshot *custom_conf, + guint flags, + GAsyncReadyCallback callback, + gpointer user_data); + +GVirDomainSnapshot * gvir_domain_create_snapshot_finish(GVirDomain *domain, +GAsyncResult *result, +GError **error); + + gboolean gvir_domain_fetch_snapshots(GVirDomain *dom, guint list_flags, GCancellable *cancellable, diff --git a/libvirt-gobject/libvirt-gobject.sym b/libvirt-gobject/libvirt-gobject.sym index ebb9418..a610121 100644 --- a/libvirt-gobject/libvirt-gobject.sym +++ b/libvirt-gobject/libvirt-gobject.sym @@ -236,6 +236,8 @@ LIBVIRT_GOBJECT_0.1.5 { LIBVIRT_GOBJECT_0.1.9 { global: + gvir_domain_create_snapshot_async; + gvir_domain_create_snapshot_finish; gvir_domain_fetch_snapshots; gvir_domain_fetch_snapshots_async; gvir_domain_fetch_snapshots_finish; -- 2.0.4 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.c
[libvirt] [libvirt-glib] [PATCH 4/4] GVirDomainSnapshot: Add async version of _delete
--- libvirt-gobject/libvirt-gobject-domain-snapshot.c | 56 +++ libvirt-gobject/libvirt-gobject-domain-snapshot.h | 9 libvirt-gobject/libvirt-gobject.sym | 2 + 3 files changed, 67 insertions(+) diff --git a/libvirt-gobject/libvirt-gobject-domain-snapshot.c b/libvirt-gobject/libvirt-gobject-domain-snapshot.c index 61ca53e..46aa70f 100644 --- a/libvirt-gobject/libvirt-gobject-domain-snapshot.c +++ b/libvirt-gobject/libvirt-gobject-domain-snapshot.c @@ -237,6 +237,62 @@ gboolean gvir_domain_snapshot_delete (GVirDomainSnapshot *snapshot, } + +static void _delete_async_thread(GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) { +GError *error = NULL; +gboolean status; + +status = gvir_domain_snapshot_delete(source_object, + GPOINTER_TO_UINT(task_data), + &error); + +if (status) +g_task_return_boolean(task, TRUE); +else +g_task_return_error(task, error); +} + + +/** + * gvir_domain_snapshot_delete_async: + * @snapshot: A #GVirDomainSnapshot + * @flags: Bitwise-OR of #GVirDomainSnapshotDeleteFlags + * @callback: (scope async): completion callback + * @user_data: (closure): opaque data for callback + */ +void gvir_domain_snapshot_delete_async(GVirDomainSnapshot *snapshot, + guint flags, + GAsyncReadyCallback callback, + gpointer user_data) { +GTask *task; + +g_return_if_fail(GVIR_IS_DOMAIN_SNAPSHOT(snapshot)); + +task = g_task_new(snapshot, NULL, callback, user_data); +g_task_set_task_data(task, GUINT_TO_POINTER(flags), NULL); +g_task_run_in_thread(task, _delete_async_thread); +g_object_unref(task); +} + +/** + * gvir_domain_snapshot_delete_finish: + * @snapshot: A #GVirDomainSnapshot + * @res: (transfer none): async method result + * + * Returns: %TRUE on success, %FALSE otherwise. + */ +gboolean gvir_domain_snapshot_delete_finish(GVirDomainSnapshot *snapshot, +GAsyncResult *res, +GError **error) { +g_return_val_if_fail(GVIR_IS_DOMAIN_SNAPSHOT(snapshot), FALSE); +g_return_val_if_fail(g_task_is_valid(res, snapshot), FALSE); + +return g_task_propagate_boolean(G_TASK(res), error); +} + /** * gvir_domain_snapshot_get_is_current: * @snapshot: The domain snapshot diff --git a/libvirt-gobject/libvirt-gobject-domain-snapshot.h b/libvirt-gobject/libvirt-gobject-domain-snapshot.h index c6262e8..ba85dee 100644 --- a/libvirt-gobject/libvirt-gobject-domain-snapshot.h +++ b/libvirt-gobject/libvirt-gobject-domain-snapshot.h @@ -98,6 +98,15 @@ gboolean gvir_domain_snapshot_delete (GVirDomainSnapshot *snapshot, guint flags, GError **error); +void gvir_domain_snapshot_delete_async(GVirDomainSnapshot *snapshot, + guint flags, + GAsyncReadyCallback callback, + gpointer user_data); + +gboolean gvir_domain_snapshot_delete_finish(GVirDomainSnapshot *snapshot, +GAsyncResult *res, +GError **error); + gboolean gvir_domain_snapshot_get_is_current(GVirDomainSnapshot *snapshot, guint flags, gboolean *is_current, diff --git a/libvirt-gobject/libvirt-gobject.sym b/libvirt-gobject/libvirt-gobject.sym index a610121..f335399 100644 --- a/libvirt-gobject/libvirt-gobject.sym +++ b/libvirt-gobject/libvirt-gobject.sym @@ -244,6 +244,8 @@ LIBVIRT_GOBJECT_0.1.9 { gvir_domain_get_snapshots; gvir_domain_get_has_current_snapshot; gvir_domain_snapshot_delete; + gvir_domain_snapshot_delete_async; + gvir_domain_snapshot_delete_finish; gvir_domain_snapshot_delete_flags_get_type; gvir_domain_snapshot_get_is_current; gvir_domain_snapshot_list_flags_get_type; -- 2.0.4 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [libvirt-glib] [PATCH 2/4] GVirDomainSnapshot: Add async version of _revert_to
--- libvirt-gobject/libvirt-gobject-domain-snapshot.c | 56 +++ libvirt-gobject/libvirt-gobject-domain-snapshot.h | 10 libvirt-gobject/libvirt-gobject.sym | 2 + 3 files changed, 68 insertions(+) diff --git a/libvirt-gobject/libvirt-gobject-domain-snapshot.c b/libvirt-gobject/libvirt-gobject-domain-snapshot.c index 62efce0..61ca53e 100644 --- a/libvirt-gobject/libvirt-gobject-domain-snapshot.c +++ b/libvirt-gobject/libvirt-gobject-domain-snapshot.c @@ -302,6 +302,62 @@ gboolean gvir_domain_snapshot_revert_to(GVirDomainSnapshot *snapshot, return TRUE; } +static void _revert_to_async_thread(GTask *task, +gpointer source_object, +gpointer task_data, +GCancellable *cancellable) { +GError *error = NULL; +gboolean status; + +status = gvir_domain_snapshot_revert_to(source_object, +GPOINTER_TO_UINT(task_data), +&error); + +if (status) +g_task_return_boolean(task, TRUE); +else +g_task_return_error(task, error); +} + + +/** + * gvir_domain_snapshot_revert_to_async: + * @snapshot: A #GVirDomainSnapshot + * @callback: (scope async): The callback + * @user_data: (closure): Opaque data for callback + */ +void gvir_domain_snapshot_revert_to_async(GVirDomainSnapshot *snapshot, + guint flags, + GAsyncReadyCallback callback, + gpointer user_data) { +GTask *task; + +g_return_if_fail(GVIR_IS_DOMAIN_SNAPSHOT(snapshot)); + +task = g_task_new(snapshot, NULL, callback, user_data); +g_task_set_task_data(task, GUINT_TO_POINTER(flags), NULL); +g_task_run_in_thread(task, _revert_to_async_thread); +g_object_unref(task); +} + + + +/** + * gvir_domain_snapshot_revert_to_finished: + * @snapshot: The domain snapshot + * @result: (transfer none): The result + * + * Returns: %TRUE on success, %FALSE otherwise. + */ +gboolean gvir_domain_snapshot_revert_to_finish(GVirDomainSnapshot *snapshot, + GAsyncResult *result, + GError **error) { +g_return_val_if_fail(GVIR_IS_DOMAIN_SNAPSHOT(snapshot), FALSE); +g_return_val_if_fail(g_task_is_valid(result, snapshot), FALSE); + +return g_task_propagate_boolean(G_TASK(result), error); +} + /** diff --git a/libvirt-gobject/libvirt-gobject-domain-snapshot.h b/libvirt-gobject/libvirt-gobject-domain-snapshot.h index 5ab3025..c6262e8 100644 --- a/libvirt-gobject/libvirt-gobject-domain-snapshot.h +++ b/libvirt-gobject/libvirt-gobject-domain-snapshot.h @@ -107,6 +107,16 @@ gboolean gvir_domain_snapshot_revert_to(GVirDomainSnapshot *snapshot, guint flags, GError **error); +void gvir_domain_snapshot_revert_to_async(GVirDomainSnapshot *snapshot, + guint flags, + GAsyncReadyCallback callback, + gpointer user_data); + +gboolean gvir_domain_snapshot_revert_to_finish(GVirDomainSnapshot *snapshot, + GAsyncResult *result, + GError **error); + + gboolean gvir_domain_snapshot_set_config(GVirDomainSnapshot *snapshot, GVirConfigDomainSnapshot *conf, GError **error); diff --git a/libvirt-gobject/libvirt-gobject.sym b/libvirt-gobject/libvirt-gobject.sym index 68e9b58..ebb9418 100644 --- a/libvirt-gobject/libvirt-gobject.sym +++ b/libvirt-gobject/libvirt-gobject.sym @@ -247,6 +247,8 @@ LIBVIRT_GOBJECT_0.1.9 { gvir_domain_snapshot_list_flags_get_type; gvir_domain_snapshot_revert_flags_get_type; gvir_domain_snapshot_revert_to; + gvir_domain_snapshot_revert_to_async; + gvir_domain_snapshot_revert_to_finish; gvir_domain_snapshot_set_config; gvir_storage_pool_state_get_type; gvir_storage_vol_resize_flags_get_type; -- 2.0.4 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [libvirt-glib] [PATCH 1/4] GVirDomain: Fix some doc comments of the snapshot API
Fixes some warnings from g-ir-scanner. --- libvirt-gobject/libvirt-gobject-domain.c | 10 +- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/libvirt-gobject/libvirt-gobject-domain.c b/libvirt-gobject/libvirt-gobject-domain.c index feac6f0..aa2a170 100644 --- a/libvirt-gobject/libvirt-gobject-domain.c +++ b/libvirt-gobject/libvirt-gobject-domain.c @@ -1529,10 +1529,10 @@ gvir_domain_create_snapshot(GVirDomain *dom, * gvir_domain_fetch_snapshots: * @dom: The domain * @list_flags: bitwise-OR of #GVirDomainSnapshotListFlags - * @cancellable: (allow-none)(transfer-none): cancellation object - * @error: (allow-none): Place-holder for error or NULL + * @cancellable: (allow-none) (transfer none): cancellation object + * @error: (allow-none): Place-holder for error or %NULL * - * Returns: TRUE on success, FALSE otherwise. + * Returns: %TRUE on success, %FALSE otherwise. */ gboolean gvir_domain_fetch_snapshots(GVirDomain *dom, guint list_flags, @@ -1647,10 +1647,10 @@ static void _fetch_snapshots_async_thread(GTask *task, /** - * + * gvir_domain_fetch_snapshots_async: * @dom: The domain * @list_flags: bitwise-OR of #GVirDomainSnapshotListFlags - * @cancellable: (allow-none)(transfer-none): cancellation object + * @cancellable: (allow-none) (transfer none): cancellation object * @callback: (scope async): completion callback * @user_data: (closure): opaque data for callback */ -- 2.0.4 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [libvirt-glib] [PATCH 0/4] Add some async versions of synchronous snapshot API
This adds async versions of a few snapshot related functions and a patch that cleans up some doc comments I crewed up in earlier commits. All the sync versions don't seem cancellable to me since we can't just throw the result away like we do when fetching snapshots in case the operation gets cancelled, so none of them take a GCancellable. Timm Bäder (4): GVirDomain: Fix some doc comments of the snapshot API GVirDomainSnapshot: Add async version of _revert_to GVirDomain: Add async version of _create_snapshot GVirDomainSnapshot: Add async version of _delete libvirt-gobject/libvirt-gobject-domain-snapshot.c | 112 ++ libvirt-gobject/libvirt-gobject-domain-snapshot.h | 19 libvirt-gobject/libvirt-gobject-domain.c | 77 ++- libvirt-gobject/libvirt-gobject-domain.h | 11 +++ libvirt-gobject/libvirt-gobject.sym | 6 ++ 5 files changed, 220 insertions(+), 5 deletions(-) -- 2.0.4 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH 4/4] GVirDomain: Add _get_has_current_snapshot
... which uses virDomainHasCurrentSnapshot to determine if the given domain has a current snapshot or not. --- libvirt-gobject/libvirt-gobject-domain.c | 34 libvirt-gobject/libvirt-gobject-domain.h | 4 libvirt-gobject/libvirt-gobject.sym | 1 + 3 files changed, 39 insertions(+) diff --git a/libvirt-gobject/libvirt-gobject-domain.c b/libvirt-gobject/libvirt-gobject-domain.c index 5399892..feac6f0 100644 --- a/libvirt-gobject/libvirt-gobject-domain.c +++ b/libvirt-gobject/libvirt-gobject-domain.c @@ -1686,3 +1686,37 @@ gboolean gvir_domain_fetch_snapshots_finish(GVirDomain *dom, return g_task_propagate_boolean(G_TASK(res), error); } + + +/** + * gvir_domain_get_has_current_snapshot: + * @dom: a #GVirDomain + * @flags: Unused, pass 0 + * @has_current_snapshot: (out): Will be set to %TRUE if the given domain + * has a current snapshot and to %FALSE otherwise. + * @error: (allow-none): Place-holder for error or %NULL + * + * Returns: %TRUE on success, %FALSE otherwise. + */ +gboolean gvir_domain_get_has_current_snapshot(GVirDomain *dom, + guint flags, + gboolean *has_current_snapshot, + GError **error) { +int status; +g_return_val_if_fail(GVIR_IS_DOMAIN(dom), FALSE); +g_return_val_if_fail(error == NULL || *error == NULL, FALSE); + +status = virDomainHasCurrentSnapshot(dom->priv->handle, + flags); + +if (status == -1) { +gvir_set_error(error, GVIR_DOMAIN_ERROR, 0, + "Unable to check if domain `%s' has a current snapshot", + gvir_domain_get_name(dom)); +return FALSE; +} + +*has_current_snapshot = status; + +return TRUE; +} diff --git a/libvirt-gobject/libvirt-gobject-domain.h b/libvirt-gobject/libvirt-gobject-domain.h index 9846375..56c80b8 100644 --- a/libvirt-gobject/libvirt-gobject-domain.h +++ b/libvirt-gobject/libvirt-gobject-domain.h @@ -380,6 +380,10 @@ gboolean gvir_domain_fetch_snapshots_finish(GVirDomain *dom, GAsyncResult *res, GError **error); +gboolean gvir_domain_get_has_current_snapshot(GVirDomain *dom, + guint flags, + gboolean *has_current_snapshot, + GError **error); G_END_DECLS diff --git a/libvirt-gobject/libvirt-gobject.sym b/libvirt-gobject/libvirt-gobject.sym index bd12239..68e9b58 100644 --- a/libvirt-gobject/libvirt-gobject.sym +++ b/libvirt-gobject/libvirt-gobject.sym @@ -240,6 +240,7 @@ LIBVIRT_GOBJECT_0.1.9 { gvir_domain_fetch_snapshots_async; gvir_domain_fetch_snapshots_finish; gvir_domain_get_snapshots; + gvir_domain_get_has_current_snapshot; gvir_domain_snapshot_delete; gvir_domain_snapshot_delete_flags_get_type; gvir_domain_snapshot_get_is_current; -- 2.0.4 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [libvirt-glib] [PATCH v2 3/4] GVirDomainSnapshot: Add _set_config
... which is basically analogous to gvir_domain_set_config --- libvirt-gobject/libvirt-gobject-domain-snapshot.c | 68 +++ libvirt-gobject/libvirt-gobject-domain-snapshot.h | 5 ++ libvirt-gobject/libvirt-gobject.sym | 1 + 3 files changed, 74 insertions(+) diff --git a/libvirt-gobject/libvirt-gobject-domain-snapshot.c b/libvirt-gobject/libvirt-gobject-domain-snapshot.c index dca1086..62efce0 100644 --- a/libvirt-gobject/libvirt-gobject-domain-snapshot.c +++ b/libvirt-gobject/libvirt-gobject-domain-snapshot.c @@ -301,3 +301,71 @@ gboolean gvir_domain_snapshot_revert_to(GVirDomainSnapshot *snapshot, return TRUE; } + + + +/** + * gvir_domain_snapshot_set_config: + * @snapshot: The domain snapshot + * @conf: The new config object + * @error: (allow-none): Place-holder for error or %NULL + * + * Updates the given snapshot's configuration according to the + * given GVirConfigDomainSnapshot. + * + * Returns: %TRUE if no error was reported, %FALSE otherwise. + */ +gboolean gvir_domain_snapshot_set_config(GVirDomainSnapshot *snapshot, + GVirConfigDomainSnapshot *conf, + GError **error) +{ +gchar *xml; +virConnectPtr conn; +virDomainSnapshotPtr handle; +virDomainPtr domain; +GVirDomainSnapshotPrivate *priv; + +g_return_val_if_fail(GVIR_IS_DOMAIN_SNAPSHOT(snapshot), FALSE); +g_return_val_if_fail(GVIR_CONFIG_IS_DOMAIN_SNAPSHOT(conf), FALSE); +g_return_val_if_fail(error == NULL || *error == NULL, FALSE); + +priv = snapshot->priv; +handle = priv->handle; +domain = virDomainSnapshotGetDomain(handle); + + +if ((conn = virDomainSnapshotGetConnect(priv->handle)) == NULL) { +gvir_set_error_literal(error, GVIR_DOMAIN_SNAPSHOT_ERROR, + 0, + "Failed to get domain connection"); +return FALSE; +} + + +/* XXX Changing the name will create a new snapshot */ +if (g_strcmp0 (gvir_domain_snapshot_get_name(snapshot), + gvir_config_domain_snapshot_get_name(conf)) != 0) { +gvir_set_error_literal(error, GVIR_DOMAIN_SNAPSHOT_ERROR, + 0, + "Cannot set config: snapshot names don't match"); +return FALSE; +} + + +xml = gvir_config_object_to_xml(GVIR_CONFIG_OBJECT(conf)); + +handle = virDomainSnapshotCreateXML(domain, +xml, +VIR_DOMAIN_SNAPSHOT_CREATE_REDEFINE); +g_free(xml); + +if (handle == NULL) { +gvir_set_error(error, GVIR_DOMAIN_SNAPSHOT_ERROR, + 0, + "Failed to create snapshot `%s' from XML definition", + gvir_domain_snapshot_get_name(snapshot)); +return FALSE; +} +virDomainSnapshotFree(handle); +return TRUE; +} diff --git a/libvirt-gobject/libvirt-gobject-domain-snapshot.h b/libvirt-gobject/libvirt-gobject-domain-snapshot.h index 7abe8ca..5ab3025 100644 --- a/libvirt-gobject/libvirt-gobject-domain-snapshot.h +++ b/libvirt-gobject/libvirt-gobject-domain-snapshot.h @@ -106,6 +106,11 @@ gboolean gvir_domain_snapshot_get_is_current(GVirDomainSnapshot *snapshot, gboolean gvir_domain_snapshot_revert_to(GVirDomainSnapshot *snapshot, guint flags, GError **error); + +gboolean gvir_domain_snapshot_set_config(GVirDomainSnapshot *snapshot, + GVirConfigDomainSnapshot *conf, + GError **error); + G_END_DECLS #endif /* __LIBVIRT_GOBJECT_DOMAIN_SNAPSHOT_H__ */ diff --git a/libvirt-gobject/libvirt-gobject.sym b/libvirt-gobject/libvirt-gobject.sym index c1c9421..bd12239 100644 --- a/libvirt-gobject/libvirt-gobject.sym +++ b/libvirt-gobject/libvirt-gobject.sym @@ -246,6 +246,7 @@ LIBVIRT_GOBJECT_0.1.9 { gvir_domain_snapshot_list_flags_get_type; gvir_domain_snapshot_revert_flags_get_type; gvir_domain_snapshot_revert_to; + gvir_domain_snapshot_set_config; gvir_storage_pool_state_get_type; gvir_storage_vol_resize_flags_get_type; gvir_storage_vol_type_get_type; -- 2.0.4 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [libvirt-glib] [PATCH v2 2/4] GVirDomainSnapshot: Add _revert_to
Add a way to revert a domain to one of its snapshots. --- libvirt-gobject/libvirt-gobject-domain-snapshot.c | 33 +++ libvirt-gobject/libvirt-gobject-domain-snapshot.h | 17 libvirt-gobject/libvirt-gobject.sym | 2 ++ 3 files changed, 52 insertions(+) diff --git a/libvirt-gobject/libvirt-gobject-domain-snapshot.c b/libvirt-gobject/libvirt-gobject-domain-snapshot.c index c53e877..dca1086 100644 --- a/libvirt-gobject/libvirt-gobject-domain-snapshot.c +++ b/libvirt-gobject/libvirt-gobject-domain-snapshot.c @@ -268,3 +268,36 @@ gboolean gvir_domain_snapshot_get_is_current(GVirDomainSnapshot *snapshot, return TRUE; } + + + +/** + * gvir_domain_snapshot_revert_to: + * @snapshot: The domain snapshot + * @flags: Bitwise OR of GVirDomainSnapshotRevertFlags + * @error: (allow-none): Place-holder for error or %NULL + * + * Returns: %TRUE if the snapshot's domain has successfully been + * reverted to the given snapshot, %FALSE otherwise, in which case + * @error will be set. + */ +gboolean gvir_domain_snapshot_revert_to(GVirDomainSnapshot *snapshot, +guint flags, +GError **error) { +int status; + +g_return_val_if_fail(GVIR_IS_DOMAIN_SNAPSHOT(snapshot), FALSE); +g_return_val_if_fail((error == NULL) || (*error == NULL), FALSE); + + +status = virDomainRevertToSnapshot(snapshot->priv->handle, + flags); +if (status != 0) { +gvir_set_error(error, GVIR_DOMAIN_SNAPSHOT_ERROR, + 0, "Failed to revert to snapshot `%s'", + gvir_domain_snapshot_get_name(snapshot)); +return FALSE; +} + +return TRUE; +} diff --git a/libvirt-gobject/libvirt-gobject-domain-snapshot.h b/libvirt-gobject/libvirt-gobject-domain-snapshot.h index 0a0bb96..7abe8ca 100644 --- a/libvirt-gobject/libvirt-gobject-domain-snapshot.h +++ b/libvirt-gobject/libvirt-gobject-domain-snapshot.h @@ -71,6 +71,19 @@ typedef enum { } GVirDomainSnapshotDeleteFlags; +/** + * GVirDomainSnapshotRevertFlags: + * @GVIR_DOMAIN_SNAPSHOT_REVERT_RUNNING: Run after revert + * @GVIR_DOMAIN_SNAPSHOT_REVERT_PAUSED: Pause after revert + * @GVIR_DOMAIN_SNAPSHOT_REVERT_FORCE: Allow risky reverts + */ +typedef enum { + GVIR_DOMAIN_SNAPSHOT_REVERT_RUNNING = 1, + GVIR_DOMAIN_SNAPSHOT_REVERT_PAUSED = 2, + GVIR_DOMAIN_SNAPSHOT_REVERT_FORCE = 4 +} GVirDomainSnapshotRevertFlags; + + GType gvir_domain_snapshot_get_type(void); GType gvir_domain_snapshot_handle_get_type(void); @@ -89,6 +102,10 @@ gboolean gvir_domain_snapshot_get_is_current(GVirDomainSnapshot *snapshot, guint flags, gboolean *is_current, GError **error); + +gboolean gvir_domain_snapshot_revert_to(GVirDomainSnapshot *snapshot, +guint flags, +GError **error); G_END_DECLS #endif /* __LIBVIRT_GOBJECT_DOMAIN_SNAPSHOT_H__ */ diff --git a/libvirt-gobject/libvirt-gobject.sym b/libvirt-gobject/libvirt-gobject.sym index c740f88..c1c9421 100644 --- a/libvirt-gobject/libvirt-gobject.sym +++ b/libvirt-gobject/libvirt-gobject.sym @@ -244,6 +244,8 @@ LIBVIRT_GOBJECT_0.1.9 { gvir_domain_snapshot_delete_flags_get_type; gvir_domain_snapshot_get_is_current; gvir_domain_snapshot_list_flags_get_type; + gvir_domain_snapshot_revert_flags_get_type; + gvir_domain_snapshot_revert_to; gvir_storage_pool_state_get_type; gvir_storage_vol_resize_flags_get_type; gvir_storage_vol_type_get_type; -- 2.0.4 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [libvirt-glib] [PATCH v2 1/4] GVirDomainSnapshot: Add _get_is_current
Add a way to determine if the given GVirDomainSnapshot is the current snapshot of its GVirDomain. --- libvirt-gobject/libvirt-gobject-domain-snapshot.c | 33 +++ libvirt-gobject/libvirt-gobject-domain-snapshot.h | 4 +++ libvirt-gobject/libvirt-gobject.sym | 1 + 3 files changed, 38 insertions(+) diff --git a/libvirt-gobject/libvirt-gobject-domain-snapshot.c b/libvirt-gobject/libvirt-gobject-domain-snapshot.c index 7bb89f1..c53e877 100644 --- a/libvirt-gobject/libvirt-gobject-domain-snapshot.c +++ b/libvirt-gobject/libvirt-gobject-domain-snapshot.c @@ -235,3 +235,36 @@ gboolean gvir_domain_snapshot_delete (GVirDomainSnapshot *snapshot, } return TRUE; } + + +/** + * gvir_domain_snapshot_get_is_current: + * @snapshot: The domain snapshot + * @flags: Currently unused, pass 0 + * @is_current: (out): %TRUE if the given snapshot is the current snapshot + * of its domain, %FALSE otherwise. + * @error: (allow-none): Place-holder for error or %NULL + * + * Returns: %TRUE on success, %FALSE otherwise. + */ +gboolean gvir_domain_snapshot_get_is_current(GVirDomainSnapshot *snapshot, + guint flags, + gboolean *is_current, + GError **error) { +gint status; + +g_return_val_if_fail(GVIR_IS_DOMAIN_SNAPSHOT(snapshot), FALSE); +g_return_val_if_fail(error == NULL || *error == NULL, FALSE); + +status = virDomainSnapshotIsCurrent(snapshot->priv->handle, flags); +if (status == -1) { +gvir_set_error(error, GVIR_DOMAIN_SNAPSHOT_ERROR, 0, + "Could not determine if `%s' is the current snapshot", + gvir_domain_snapshot_get_name(snapshot)); +return FALSE; +} + +*is_current = status; + +return TRUE; +} diff --git a/libvirt-gobject/libvirt-gobject-domain-snapshot.h b/libvirt-gobject/libvirt-gobject-domain-snapshot.h index b3ebe7f..0a0bb96 100644 --- a/libvirt-gobject/libvirt-gobject-domain-snapshot.h +++ b/libvirt-gobject/libvirt-gobject-domain-snapshot.h @@ -85,6 +85,10 @@ gboolean gvir_domain_snapshot_delete (GVirDomainSnapshot *snapshot, guint flags, GError **error); +gboolean gvir_domain_snapshot_get_is_current(GVirDomainSnapshot *snapshot, + guint flags, + gboolean *is_current, + GError **error); G_END_DECLS #endif /* __LIBVIRT_GOBJECT_DOMAIN_SNAPSHOT_H__ */ diff --git a/libvirt-gobject/libvirt-gobject.sym b/libvirt-gobject/libvirt-gobject.sym index b0c55b5..c740f88 100644 --- a/libvirt-gobject/libvirt-gobject.sym +++ b/libvirt-gobject/libvirt-gobject.sym @@ -242,6 +242,7 @@ LIBVIRT_GOBJECT_0.1.9 { gvir_domain_get_snapshots; gvir_domain_snapshot_delete; gvir_domain_snapshot_delete_flags_get_type; + gvir_domain_snapshot_get_is_current; gvir_domain_snapshot_list_flags_get_type; gvir_storage_pool_state_get_type; gvir_storage_vol_resize_flags_get_type; -- 2.0.4 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [libvirt-glib] [PATCH v2 4/4] GVirDomain: Add _has_current_snapshot
... which uses virDomainHasCurrentSnapshot to determine if the given domain has a current snapshot or not. --- libvirt-gobject/libvirt-gobject-domain.c | 34 libvirt-gobject/libvirt-gobject-domain.h | 4 libvirt-gobject/libvirt-gobject.sym | 1 + 3 files changed, 39 insertions(+) diff --git a/libvirt-gobject/libvirt-gobject-domain.c b/libvirt-gobject/libvirt-gobject-domain.c index 5399892..f3794cc 100644 --- a/libvirt-gobject/libvirt-gobject-domain.c +++ b/libvirt-gobject/libvirt-gobject-domain.c @@ -1686,3 +1686,37 @@ gboolean gvir_domain_fetch_snapshots_finish(GVirDomain *dom, return g_task_propagate_boolean(G_TASK(res), error); } + + +/** + * gvir_domain_has_current_snapshot: + * @dom: a #GVirDomain + * @flags: Unused, pass 0 + * @has_current_snapshot: (out): Will be set to %TRUE if the given domain + * has a current snapshot and to %FALSE otherwise. + * @error: (allow-none): Place-holder for error or %NULL + * + * Returns: %TRUE on success, %FALSE otherwise. + */ +gboolean gvir_domain_has_current_snapshot(GVirDomain *dom, + guint flags, + gboolean *has_current_snapshot, + GError **error) { +int status; +g_return_val_if_fail(GVIR_IS_DOMAIN(dom), FALSE); +g_return_val_if_fail(error == NULL || *error == NULL, FALSE); + +status = virDomainHasCurrentSnapshot(dom->priv->handle, + flags); + +if (status == -1) { +gvir_set_error(error, GVIR_DOMAIN_ERROR, 0, + "Unable to check if domain `%s' has a current snapshot", + gvir_domain_get_name(dom)); +return FALSE; +} + +*has_current_snapshot = status; + +return TRUE; +} diff --git a/libvirt-gobject/libvirt-gobject-domain.h b/libvirt-gobject/libvirt-gobject-domain.h index 9846375..52b805f 100644 --- a/libvirt-gobject/libvirt-gobject-domain.h +++ b/libvirt-gobject/libvirt-gobject-domain.h @@ -380,6 +380,10 @@ gboolean gvir_domain_fetch_snapshots_finish(GVirDomain *dom, GAsyncResult *res, GError **error); +gboolean gvir_domain_has_current_snapshot(GVirDomain *dom, + guint flags, + gboolean *has_current_snapshot, + GError **error); G_END_DECLS diff --git a/libvirt-gobject/libvirt-gobject.sym b/libvirt-gobject/libvirt-gobject.sym index bd12239..c34bf02 100644 --- a/libvirt-gobject/libvirt-gobject.sym +++ b/libvirt-gobject/libvirt-gobject.sym @@ -240,6 +240,7 @@ LIBVIRT_GOBJECT_0.1.9 { gvir_domain_fetch_snapshots_async; gvir_domain_fetch_snapshots_finish; gvir_domain_get_snapshots; + gvir_domain_has_current_snapshot; gvir_domain_snapshot_delete; gvir_domain_snapshot_delete_flags_get_type; gvir_domain_snapshot_get_is_current; -- 2.0.4 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [libvirt-glib] [PATCH 3/4] GVirDomainSnapshot: Add _set_config
On 06.08, Christophe Fergeau wrote: > Hey, > > Thanks for the detailed explanation! > > On Tue, Aug 05, 2014 at 03:52:17PM +0200, Timm Bäder wrote: > > Also in reply to the 0/4: > > It will modify the existing one, as long as you don't change the name. > > Like if you use get_config, then set_description on that config and > > then _set_config again, no additional snapshot will be created. > > If you change only the snapshot's name and then use set_config on it, > > it'll create a new snapshot that is equivalent to the snapshot you > > wanted to modify except for the name (and to really "modify" the old > > snapshot, you now have to delete the old one, which is one reason why > > we show the description to the user instead of the name in gnome-boxes). > > I had a conversation with eblake on IRC about this and it seemed like > > this is the wanted behavior (or at least it's a well-known limitation?). > > > > So I guess the name is still correct, but maybe the docs should mention > > that renaming won't work as expected? > > Hmm at this point I'd error out if the name is different. If people > complain about this, or if this is too limiting, then we can reconsider > with clear use cases to decide how this should behave. How does that > sound? > > Christophe That sounds good to me, thanks. -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [libvirt-glib] [PATCH 3/4] GVirDomainSnapshot: Add _set_config
On 05.08, Christophe Fergeau wrote: > On Sat, Aug 02, 2014 at 10:41:48AM +0200, m...@baedert.org wrote: > > From: Timm Bäder > > > > ... which is basically analogous to gvir_domain_set_config > > --- > > libvirt-gobject/libvirt-gobject-domain-snapshot.c | 58 > > +++ > > libvirt-gobject/libvirt-gobject-domain-snapshot.h | 5 ++ > > libvirt-gobject/libvirt-gobject.sym | 1 + > > 3 files changed, 64 insertions(+) > > > > diff --git a/libvirt-gobject/libvirt-gobject-domain-snapshot.c > > b/libvirt-gobject/libvirt-gobject-domain-snapshot.c > > index 497288f..2c81882 100644 > > --- a/libvirt-gobject/libvirt-gobject-domain-snapshot.c > > +++ b/libvirt-gobject/libvirt-gobject-domain-snapshot.c > > @@ -297,3 +297,61 @@ gboolean > > gvir_domain_snapshot_revert_to(GVirDomainSnapshot *snapshot, > > > > return TRUE; > > } > > + > > + > > + > > +/** > > + * gvir_domain_snapshot_set_config: > > + * @snapshot: The domain snapshot > > + * @conf: The new config object > > + * @error: (allow-none): Place-holder for error or NULL > > + * > > + * Updates the given snapshot's configuration according to the > > + * given GVirConfigDomainSnapshot. > > + * > > + * Returns: TRUE if no error was reported, FALSE otherwise. > > + */ > > +gboolean gvir_domain_snapshot_set_config(GVirDomainSnapshot *snapshot, > > + GVirConfigDomainSnapshot *conf, > > + GError **error) > > +{ > > +gchar *xml; > > +virConnectPtr conn; > > +virDomainSnapshotPtr handle; > > +virDomainPtr domain; > > +GVirDomainSnapshotPrivate *priv; > > + > > +g_return_val_if_fail(GVIR_IS_DOMAIN_SNAPSHOT(snapshot), FALSE); > > +g_return_val_if_fail(GVIR_CONFIG_IS_DOMAIN_SNAPSHOT(conf), FALSE); > > +g_return_val_if_fail(error == NULL || *error == NULL, FALSE); > > + > > +priv = snapshot->priv; > > +handle = priv->handle; > > +domain = virDomainSnapshotGetDomain(handle); > > + > > + > > +if ((conn = virDomainSnapshotGetConnect(priv->handle)) == NULL) { > > +gvir_set_error_literal(error, GVIR_DOMAIN_SNAPSHOT_ERROR, > > + 0, > > + "Failed to get domain connection"); > > +return FALSE; > > +} > > + > > + > > +xml = gvir_config_object_to_xml(GVIR_CONFIG_OBJECT(conf)); > > + > > +handle = virDomainSnapshotCreateXML(domain, > > +xml, > > + > > VIR_DOMAIN_SNAPSHOT_CREATE_REDEFINE); > > +free(xml); > > g_free here. > > > + > > +if (handle == NULL) { > > +gvir_set_error(error, GVIR_DOMAIN_SNAPSHOT_ERROR, > > + 0, > > + "Failed to create Snapshot `%s' from XML > > definition", > > "snapshot" could have a lower case here. > > I'm not exactly clear on what this method will be doing according to > your 0/4. If it creates a new snapshot rather than modifying an > existing one, maybe the name should be different/this should not be > wrapped? > > Christophe Also in reply to the 0/4: It will modify the existing one, as long as you don't change the name. Like if you use get_config, then set_description on that config and then _set_config again, no additional snapshot will be created. If you change only the snapshot's name and then use set_config on it, it'll create a new snapshot that is equivalent to the snapshot you wanted to modify except for the name (and to really "modify" the old snapshot, you now have to delete the old one, which is one reason why we show the description to the user instead of the name in gnome-boxes). I had a conversation with eblake on IRC about this and it seemed like this is the wanted behavior (or at least it's a well-known limitation?). So I guess the name is still correct, but maybe the docs should mention that renaming won't work as expected? Regards, Timm -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [libvirt-glib] [PATCH v5 1/3] libvirt-gobject-domain: Add _fetch_snapshots
This function can be used to fetch the snapshots of a domain (according to the given GVirDomainSnapshotListFlags) and save them in a domain-internal GHashTable. A function to access them from outside will be added in a later patch. --- libvirt-gobject/libvirt-gobject-domain.c | 86 libvirt-gobject/libvirt-gobject-domain.h | 37 ++ libvirt-gobject/libvirt-gobject.sym | 2 + 3 files changed, 125 insertions(+) diff --git a/libvirt-gobject/libvirt-gobject-domain.c b/libvirt-gobject/libvirt-gobject-domain.c index c6e30e5..adb5179 100644 --- a/libvirt-gobject/libvirt-gobject-domain.c +++ b/libvirt-gobject/libvirt-gobject-domain.c @@ -38,6 +38,8 @@ struct _GVirDomainPrivate { virDomainPtr handle; gchar uuid[VIR_UUID_STRING_BUFLEN]; +GHashTable *snapshots; +GMutex *lock; }; G_DEFINE_TYPE(GVirDomain, gvir_domain, G_TYPE_OBJECT); @@ -121,6 +123,11 @@ static void gvir_domain_finalize(GObject *object) g_debug("Finalize GVirDomain=%p", domain); +if (priv->snapshots) { +g_hash_table_unref(priv->snapshots); +} +g_mutex_free(priv->lock); + virDomainFree(priv->handle); G_OBJECT_CLASS(gvir_domain_parent_class)->finalize(object); @@ -237,6 +244,7 @@ static void gvir_domain_init(GVirDomain *domain) g_debug("Init GVirDomain=%p", domain); domain->priv = GVIR_DOMAIN_GET_PRIVATE(domain); +domain->priv->lock = g_mutex_new(); } typedef struct virDomain GVirDomainHandle; @@ -1514,3 +1522,81 @@ gvir_domain_create_snapshot(GVirDomain *dom, g_free(custom_xml); return dom_snapshot; } + + + +/** + * gvir_domain_fetch_snapshots: + * @dom: The domain + * @list_flags: bitwise-OR of #GVirDomainSnapshotListFlags + * @cancellable: (allow-none)(transfer-none): cancellation object + * @error: (allow-none): Place-holder for error or NULL + * + * Returns: TRUE on success, FALSE otherwise. + */ +gboolean gvir_domain_fetch_snapshots(GVirDomain *dom, + guint list_flags, + GCancellable *cancellable, + GError **error) +{ +GVirDomainPrivate *priv; +virDomainSnapshotPtr *snapshots = NULL; +GVirDomainSnapshot *snap; +GHashTable *snap_table; +int n_snaps = 0; +int i; +gboolean ret = TRUE; + +g_return_val_if_fail(GVIR_IS_DOMAIN(dom), FALSE); +g_return_val_if_fail((error == NULL) || (*error == NULL), FALSE); + +priv = dom->priv; + +snap_table = g_hash_table_new_full(g_str_hash, + g_str_equal, + NULL, + g_object_unref); + + +n_snaps = virDomainListAllSnapshots(priv->handle, &snapshots, list_flags); + +if (g_cancellable_set_error_if_cancelled(cancellable, error)) { +ret = FALSE; +goto cleanup; +} + +if (n_snaps < 0) { +gvir_set_error(error, GVIR_DOMAIN_ERROR, 0, + "Unable to fetch snapshots of %s", + gvir_domain_get_name(dom)); +ret = FALSE; +goto cleanup; +} + +for (i = 0; i < n_snaps; i ++) { +if (g_cancellable_set_error_if_cancelled(cancellable, error)) { +ret = FALSE; +goto cleanup; +} +snap = GVIR_DOMAIN_SNAPSHOT(g_object_new(GVIR_TYPE_DOMAIN_SNAPSHOT, + "handle", snapshots[i], + NULL)); +g_hash_table_insert(snap_table, +(gpointer)gvir_domain_snapshot_get_name(snap), +snap); +} + + +g_mutex_lock(priv->lock); +if (priv->snapshots != NULL) +g_hash_table_unref(priv->snapshots); +priv->snapshots = snap_table; +snap_table = NULL; +g_mutex_unlock(priv->lock); + +cleanup: +free(snapshots); +if (snap_table != NULL) +g_hash_table_unref (snap_table); +return ret; +} diff --git a/libvirt-gobject/libvirt-gobject-domain.h b/libvirt-gobject/libvirt-gobject-domain.h index 38d3458..8c1a8e5 100644 --- a/libvirt-gobject/libvirt-gobject-domain.h +++ b/libvirt-gobject/libvirt-gobject-domain.h @@ -183,6 +183,39 @@ typedef enum { GVIR_DOMAIN_REBOOT_GUEST_AGENT= VIR_DOMAIN_REBOOT_GUEST_AGENT, } GVirDomainRebootFlags; +/** + * GVirDomainSnapshotListFlags: + * @GVIR_DOMAIN_SNAPSHOT_LIST_ALL: List all snapshots + * @GVIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS: List all descendants, not just + * children, when listing a snapshot. + * For historical reasons, groups do not use contiguous bits. + * @GVIR_DOMAIN_SNAPSHOT_LIST_ROOTS: Filter by snapshots with no parents, when listing a domain + * @GVIR_DOMAIN_SNAPSHOT_LIST_METADATA: Filter by snapshots which have metadata + * @GVIR_DOMAIN_SNAPSHOT_LIST_LEAVES: Filter by snapshots wi
[libvirt] [libvirt-glib] [PATCH v5 3/3] GVirDomain: Add async version of _fetch_snapshots
--- libvirt-gobject/libvirt-gobject-domain.c | 61 libvirt-gobject/libvirt-gobject-domain.h | 10 ++ libvirt-gobject/libvirt-gobject.sym | 2 ++ 3 files changed, 73 insertions(+) diff --git a/libvirt-gobject/libvirt-gobject-domain.c b/libvirt-gobject/libvirt-gobject-domain.c index 8f48c2e..7fd5043 100644 --- a/libvirt-gobject/libvirt-gobject-domain.c +++ b/libvirt-gobject/libvirt-gobject-domain.c @@ -1621,3 +1621,64 @@ GList *gvir_domain_get_snapshots(GVirDomain *dom) return snapshots; } + + + +static void _fetch_snapshots_async_thread(GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) { +GError *error = NULL; +gboolean status; + +status = gvir_domain_fetch_snapshots(source_object, + GPOINTER_TO_UINT(task_data), + cancellable, + &error); +if (status) +g_task_return_boolean(task, TRUE); +else +g_task_return_error(task, error); +} + + +/** + * + * @dom: The domain + * @list_flags: bitwise-OR of #GVirDomainSnapshotListFlags + * @cancellable: (allow-none)(transfer-none): cancellation object + * @callback: (scope async): completion callback + * @user_data: (closure): opaque data for callback + */ +void gvir_domain_fetch_snapshots_async(GVirDomain *dom, + guint list_flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) { +GTask *task; + +g_return_if_fail(GVIR_IS_DOMAIN(dom)); +g_return_if_fail((cancellable == NULL) || G_IS_CANCELLABLE(cancellable)); + +task = g_task_new(dom, cancellable, callback, user_data); +g_task_set_task_data(task, GUINT_TO_POINTER(list_flags), NULL); +g_task_run_in_thread(task, _fetch_snapshots_async_thread); +g_object_unref(task); +} + + +/** + * gvir_domain_fetch_snapshots_finish: + * @dom: a #GVirDomain + * @res: (transfer none): async method result + * + * Returns: TRUE on success, FALSE otherwise. + */ +gboolean gvir_domain_fetch_snapshots_finish(GVirDomain *dom, +GAsyncResult *res, +GError **error) { +g_return_val_if_fail(GVIR_IS_DOMAIN(dom), FALSE); +g_return_val_if_fail(g_task_is_valid(res, dom), FALSE); + +return g_task_propagate_boolean(G_TASK(res), error); +} diff --git a/libvirt-gobject/libvirt-gobject-domain.h b/libvirt-gobject/libvirt-gobject-domain.h index 22870c1..9846375 100644 --- a/libvirt-gobject/libvirt-gobject-domain.h +++ b/libvirt-gobject/libvirt-gobject-domain.h @@ -370,6 +370,16 @@ gboolean gvir_domain_fetch_snapshots(GVirDomain *dom, GList *gvir_domain_get_snapshots(GVirDomain *dom); +void gvir_domain_fetch_snapshots_async(GVirDomain *dom, + guint list_flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +gboolean gvir_domain_fetch_snapshots_finish(GVirDomain *dom, +GAsyncResult *res, +GError **error); + G_END_DECLS diff --git a/libvirt-gobject/libvirt-gobject.sym b/libvirt-gobject/libvirt-gobject.sym index 28e547a..6aa8b86 100644 --- a/libvirt-gobject/libvirt-gobject.sym +++ b/libvirt-gobject/libvirt-gobject.sym @@ -237,6 +237,8 @@ LIBVIRT_GOBJECT_0.1.5 { LIBVIRT_GOBJECT_0.1.9 { global: gvir_domain_fetch_snapshots; + gvir_domain_fetch_snapshots_async; + gvir_domain_fetch_snapshots_finish; gvir_domain_get_snapshots; gvir_domain_snapshot_delete; gvir_domain_snapshot_list_flags_get_type; -- 2.0.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [libvirt-glib] [PATCH v5 2/3] libvirt-gobject-domain: Add _get_snapshots
... which returns a GList of GVirDomainSnapshots, i.e. without any tree structure or other relationship between the snapshots. --- libvirt-gobject/libvirt-gobject-domain.c | 21 + libvirt-gobject/libvirt-gobject-domain.h | 4 libvirt-gobject/libvirt-gobject.sym | 1 + 3 files changed, 26 insertions(+) diff --git a/libvirt-gobject/libvirt-gobject-domain.c b/libvirt-gobject/libvirt-gobject-domain.c index adb5179..8f48c2e 100644 --- a/libvirt-gobject/libvirt-gobject-domain.c +++ b/libvirt-gobject/libvirt-gobject-domain.c @@ -1600,3 +1600,24 @@ cleanup: g_hash_table_unref (snap_table); return ret; } + +/** + * gvir_domain_get_snapshots: + * @dom: The domain + * Returns: (element-type LibvirtGObject.DomainSnapshot) (transfer full): A + * list of all the snapshots available for the given domain. The returned + * list should be freed with g_list_free(), after its elements have been + * unreffed with g_object_unref(). + */ +GList *gvir_domain_get_snapshots(GVirDomain *dom) +{ +GList *snapshots = NULL; +g_return_val_if_fail(GVIR_IS_DOMAIN(dom), NULL); + +if (dom->priv->snapshots != NULL) { +snapshots = g_hash_table_get_values(dom->priv->snapshots); +g_list_foreach(snapshots, (GFunc)g_object_ref, NULL); +} + +return snapshots; +} diff --git a/libvirt-gobject/libvirt-gobject-domain.h b/libvirt-gobject/libvirt-gobject-domain.h index 8c1a8e5..22870c1 100644 --- a/libvirt-gobject/libvirt-gobject-domain.h +++ b/libvirt-gobject/libvirt-gobject-domain.h @@ -367,6 +367,10 @@ gboolean gvir_domain_fetch_snapshots(GVirDomain *dom, guint list_flags, GCancellable *cancellable, GError **error); + +GList *gvir_domain_get_snapshots(GVirDomain *dom); + + G_END_DECLS #endif /* __LIBVIRT_GOBJECT_DOMAIN_H__ */ diff --git a/libvirt-gobject/libvirt-gobject.sym b/libvirt-gobject/libvirt-gobject.sym index 781310f..28e547a 100644 --- a/libvirt-gobject/libvirt-gobject.sym +++ b/libvirt-gobject/libvirt-gobject.sym @@ -237,6 +237,7 @@ LIBVIRT_GOBJECT_0.1.5 { LIBVIRT_GOBJECT_0.1.9 { global: gvir_domain_fetch_snapshots; + gvir_domain_get_snapshots; gvir_domain_snapshot_delete; gvir_domain_snapshot_list_flags_get_type; } LIBVIRT_GOBJECT_0.1.5; -- 2.0.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [libvirt-glib] [PATCH v4 3/3] GVirDomain: Add async version of _fetch_snapshots
On 07.07, Christophe Fergeau wrote: > Hey, > > On Mon, Jun 30, 2014 at 07:50:16PM +0200, Timm Bäder wrote: > > --- > > libvirt-gobject/libvirt-gobject-domain.c | 60 > > > > libvirt-gobject/libvirt-gobject-domain.h | 10 ++ > > libvirt-gobject/libvirt-gobject.sym | 2 ++ > > 3 files changed, 72 insertions(+) > > > > diff --git a/libvirt-gobject/libvirt-gobject-domain.c > > b/libvirt-gobject/libvirt-gobject-domain.c > > index b12a4a0..6b53d25 100644 > > --- a/libvirt-gobject/libvirt-gobject-domain.c > > +++ b/libvirt-gobject/libvirt-gobject-domain.c > > @@ -1618,3 +1618,63 @@ GList *gvir_domain_get_snapshots(GVirDomain *dom) > > > > return snapshots; > > } > > + > > + > > + > > +static void _fetch_snapshots_async_thread(GTask *task, > > + gpointer source_object, > > + gpointer task_data, > > + GCancellable *cancellable) { > > +GError *error = NULL; > > +gboolean status; > > + > > +status = gvir_domain_fetch_snapshots(source_object, > > + GPOINTER_TO_UINT(task_data), > > + cancellable, > > + &error); > > +if (status) > > +g_task_return_boolean(task, TRUE); > > +else > > +g_task_return_error(task, error); > > +} > > + > > + > > +/** > > + * > > + * @dom: The domain > > + * @list_flags: bitwise-OR of #GVirDomainSnapshotListFlags > > + * @cancellable: (allow-none)(transfer-none): cancellation object > > + * @callback: (scope async): completion callback > > + * @user_data: (closure): opaque data for callback > > + */ > > +void gvir_domain_fetch_snapshots_async(GVirDomain *dom, > > + guint list_flags, > > + GCancellable *cancellable, > > + GAsyncReadyCallback callback, > > + gpointer user_data) { > > +GTask *task; > > + > > +g_return_if_fail(GVIR_IS_DOMAIN(dom)); > > +g_return_if_fail((cancellable == NULL) || > > G_IS_CANCELLABLE(cancellable)); > > + > > +task = g_task_new(dom, cancellable, callback, user_data); > > GTask was introduced in glib 2.36, so configure.ac needs to be updated > to reflect that. glib 2.36 was released in March 2013, and is available > in RHEL7, so using this would be fine with me. Others may want to > disagree though :) > > > +g_task_set_task_data(task, GUINT_TO_POINTER(list_flags), NULL); > > +g_task_run_in_thread(task, _fetch_snapshots_async_thread); > > I'm a bit unclear as how the initial ref obtained through g_task_new() > is handled. Have you checked it's correctly freed after _finish() has > been called and that it's not leaked? Ouch, I've been fooled by the example in the GTask documentation (which was wrong), it does ineed have to be unreffed in the function that calls g_task_run_in_thread (which will itself take its own ref). > > Looks good otherwise. > > Christophe > -- > libvir-list mailing list > libvir-list@redhat.com > https://www.redhat.com/mailman/listinfo/libvir-list -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [libvirt-glib] [PATCH v4 2/3] libvirt-gobject-domain: Add _get_snapshots
On 07.07, Christophe Fergeau wrote: > Hey, > > On Mon, Jun 30, 2014 at 07:50:15PM +0200, Timm Bäder wrote: > > ... which returns a GList of GVirDomainSnapshots, i.e. without any tree > > structure or other relationship between the snapshots. > > Looks good, ACK. Any plans to return the snapshots as a tree at some > point? Or can the library user reconstruct this tree information from > the current API? > > Christophe I don't really have plans on this (since I don't need it) but since there's gvir_config_domain_snapshot_get_parent exists I guess it can be done manually (although not very convenient...). Timm -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [libvirt-glib] [PATCH v4 3/3] GVirDomain: Add async version of _fetch_snapshots
--- libvirt-gobject/libvirt-gobject-domain.c | 60 libvirt-gobject/libvirt-gobject-domain.h | 10 ++ libvirt-gobject/libvirt-gobject.sym | 2 ++ 3 files changed, 72 insertions(+) diff --git a/libvirt-gobject/libvirt-gobject-domain.c b/libvirt-gobject/libvirt-gobject-domain.c index b12a4a0..6b53d25 100644 --- a/libvirt-gobject/libvirt-gobject-domain.c +++ b/libvirt-gobject/libvirt-gobject-domain.c @@ -1618,3 +1618,63 @@ GList *gvir_domain_get_snapshots(GVirDomain *dom) return snapshots; } + + + +static void _fetch_snapshots_async_thread(GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) { +GError *error = NULL; +gboolean status; + +status = gvir_domain_fetch_snapshots(source_object, + GPOINTER_TO_UINT(task_data), + cancellable, + &error); +if (status) +g_task_return_boolean(task, TRUE); +else +g_task_return_error(task, error); +} + + +/** + * + * @dom: The domain + * @list_flags: bitwise-OR of #GVirDomainSnapshotListFlags + * @cancellable: (allow-none)(transfer-none): cancellation object + * @callback: (scope async): completion callback + * @user_data: (closure): opaque data for callback + */ +void gvir_domain_fetch_snapshots_async(GVirDomain *dom, + guint list_flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) { +GTask *task; + +g_return_if_fail(GVIR_IS_DOMAIN(dom)); +g_return_if_fail((cancellable == NULL) || G_IS_CANCELLABLE(cancellable)); + +task = g_task_new(dom, cancellable, callback, user_data); +g_task_set_task_data(task, GUINT_TO_POINTER(list_flags), NULL); +g_task_run_in_thread(task, _fetch_snapshots_async_thread); +} + + +/** + * gvir_domain_fetch_snapshots_finish: + * @dom: a #GVirDomain + * @res: (transfer none): async method result + * + * Returns: TRUE on success, FALSE otherwise. + */ +gboolean gvir_domain_fetch_snapshots_finish(GVirDomain *dom, +GAsyncResult *res, +GError **error) { +g_return_val_if_fail(GVIR_IS_DOMAIN(dom), FALSE); +g_return_val_if_fail(g_task_is_valid(res, dom), FALSE); + +return g_task_propagate_boolean(G_TASK(res), error); +} diff --git a/libvirt-gobject/libvirt-gobject-domain.h b/libvirt-gobject/libvirt-gobject-domain.h index 22870c1..9846375 100644 --- a/libvirt-gobject/libvirt-gobject-domain.h +++ b/libvirt-gobject/libvirt-gobject-domain.h @@ -370,6 +370,16 @@ gboolean gvir_domain_fetch_snapshots(GVirDomain *dom, GList *gvir_domain_get_snapshots(GVirDomain *dom); +void gvir_domain_fetch_snapshots_async(GVirDomain *dom, + guint list_flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +gboolean gvir_domain_fetch_snapshots_finish(GVirDomain *dom, +GAsyncResult *res, +GError **error); + G_END_DECLS diff --git a/libvirt-gobject/libvirt-gobject.sym b/libvirt-gobject/libvirt-gobject.sym index 28e547a..6aa8b86 100644 --- a/libvirt-gobject/libvirt-gobject.sym +++ b/libvirt-gobject/libvirt-gobject.sym @@ -237,6 +237,8 @@ LIBVIRT_GOBJECT_0.1.5 { LIBVIRT_GOBJECT_0.1.9 { global: gvir_domain_fetch_snapshots; + gvir_domain_fetch_snapshots_async; + gvir_domain_fetch_snapshots_finish; gvir_domain_get_snapshots; gvir_domain_snapshot_delete; gvir_domain_snapshot_list_flags_get_type; -- 2.0.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [libvirt-glib] [PATCH v4 1/3] libvirt-gobject-domain: Add _fetch_snapshots
This function can be used to fetch the snapshots of a domain (according to the given GVirDomainSnapshotListFlags) and save them in a domain-internal GHashTable. A function to access them from outside will be added in a later patch. --- libvirt-gobject/libvirt-gobject-domain.c | 83 libvirt-gobject/libvirt-gobject-domain.h | 37 ++ libvirt-gobject/libvirt-gobject.sym | 2 + 3 files changed, 122 insertions(+) diff --git a/libvirt-gobject/libvirt-gobject-domain.c b/libvirt-gobject/libvirt-gobject-domain.c index c6e30e5..180a206 100644 --- a/libvirt-gobject/libvirt-gobject-domain.c +++ b/libvirt-gobject/libvirt-gobject-domain.c @@ -38,6 +38,8 @@ struct _GVirDomainPrivate { virDomainPtr handle; gchar uuid[VIR_UUID_STRING_BUFLEN]; +GHashTable *snapshots; +GMutex *lock; }; G_DEFINE_TYPE(GVirDomain, gvir_domain, G_TYPE_OBJECT); @@ -121,6 +123,11 @@ static void gvir_domain_finalize(GObject *object) g_debug("Finalize GVirDomain=%p", domain); +if (priv->snapshots) { +g_hash_table_unref(priv->snapshots); +} +g_mutex_free(priv->lock); + virDomainFree(priv->handle); G_OBJECT_CLASS(gvir_domain_parent_class)->finalize(object); @@ -237,6 +244,7 @@ static void gvir_domain_init(GVirDomain *domain) g_debug("Init GVirDomain=%p", domain); domain->priv = GVIR_DOMAIN_GET_PRIVATE(domain); +domain->priv->lock = g_mutex_new(); } typedef struct virDomain GVirDomainHandle; @@ -1514,3 +1522,78 @@ gvir_domain_create_snapshot(GVirDomain *dom, g_free(custom_xml); return dom_snapshot; } + + + +/** + * gvir_domain_fetch_snapshots: + * @dom: The domain + * @list_flags: bitwise-OR of #GVirDomainSnapshotListFlags + * @cancellable: (allow-none)(transfer-none): cancellation object + * @error: (allow-none): Place-holder for error or NULL + * + * Returns: TRUE on success, FALSE otherwise. + */ +gboolean gvir_domain_fetch_snapshots(GVirDomain *dom, + guint list_flags, + GCancellable *cancellable, + GError **error) +{ +GVirDomainPrivate *priv; +virDomainSnapshotPtr *snapshots = NULL; +GVirDomainSnapshot *snap; +GHashTable *snap_table; +int n_snaps = 0; +int i; +gboolean ret = TRUE; + +g_return_val_if_fail(GVIR_IS_DOMAIN(dom), FALSE); +g_return_val_if_fail((error == NULL) || (*error == NULL), FALSE); + +priv = dom->priv; + +snap_table = g_hash_table_new_full(g_str_hash, + g_str_equal, + NULL, + g_object_unref); + + +n_snaps = virDomainListAllSnapshots(priv->handle, &snapshots, list_flags); + +if (g_cancellable_set_error_if_cancelled(cancellable, error)) { +ret = FALSE; +goto cleanup; +} + +if (n_snaps < 0) { +gvir_set_error(error, GVIR_DOMAIN_ERROR, 0, + "Unable to fetch snapshots of %s", + gvir_domain_get_name(dom)); +ret = FALSE; +goto cleanup; +} + +for (i = 0; i < n_snaps; i ++) { +if (g_cancellable_set_error_if_cancelled(cancellable, error)) { +ret = FALSE; +goto cleanup; +} +snap = GVIR_DOMAIN_SNAPSHOT(g_object_new(GVIR_TYPE_DOMAIN_SNAPSHOT, + "handle", snapshots[i], + NULL)); +g_hash_table_insert(snap_table, +(gpointer)gvir_domain_snapshot_get_name(snap), +snap); +} + + +g_mutex_lock(priv->lock); +if (priv->snapshots != NULL) +g_hash_table_unref(priv->snapshots); +priv->snapshots = snap_table; +g_mutex_unlock(priv->lock); + +cleanup: +free(snapshots); +return ret; +} diff --git a/libvirt-gobject/libvirt-gobject-domain.h b/libvirt-gobject/libvirt-gobject-domain.h index 38d3458..8c1a8e5 100644 --- a/libvirt-gobject/libvirt-gobject-domain.h +++ b/libvirt-gobject/libvirt-gobject-domain.h @@ -183,6 +183,39 @@ typedef enum { GVIR_DOMAIN_REBOOT_GUEST_AGENT= VIR_DOMAIN_REBOOT_GUEST_AGENT, } GVirDomainRebootFlags; +/** + * GVirDomainSnapshotListFlags: + * @GVIR_DOMAIN_SNAPSHOT_LIST_ALL: List all snapshots + * @GVIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS: List all descendants, not just + * children, when listing a snapshot. + * For historical reasons, groups do not use contiguous bits. + * @GVIR_DOMAIN_SNAPSHOT_LIST_ROOTS: Filter by snapshots with no parents, when listing a domain + * @GVIR_DOMAIN_SNAPSHOT_LIST_METADATA: Filter by snapshots which have metadata + * @GVIR_DOMAIN_SNAPSHOT_LIST_LEAVES: Filter by snapshots with no children + * @GVIR_DOMAIN_SNAPSHOT_LIST_NO_LEAVES: Filter by snapshots that have children
[libvirt] [libvirt-glib] [PATCH v4 0/3] Add API to fetch snapshots
Argh, sorry about the earlier version, die last mail didn't get through the smtp server. This patchset replaces the old one and includes gvir_domain_fetch_snapshots_async as well as a version of gvir_domain_fetch_snapshots that works with it. Timm Bäder (3): libvirt-gobject-domain: Add _fetch_snapshots libvirt-gobject-domain: Add _get_snapshots GVirDomain: Add async version of _fetch_snapshots libvirt-gobject/libvirt-gobject-domain.c | 164 +++ libvirt-gobject/libvirt-gobject-domain.h | 51 ++ libvirt-gobject/libvirt-gobject.sym | 5 + 3 files changed, 220 insertions(+) -- 2.0.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [libvirt-glib] [PATCH v4 2/3] libvirt-gobject-domain: Add _get_snapshots
... which returns a GList of GVirDomainSnapshots, i.e. without any tree structure or other relationship between the snapshots. --- libvirt-gobject/libvirt-gobject-domain.c | 21 + libvirt-gobject/libvirt-gobject-domain.h | 4 libvirt-gobject/libvirt-gobject.sym | 1 + 3 files changed, 26 insertions(+) diff --git a/libvirt-gobject/libvirt-gobject-domain.c b/libvirt-gobject/libvirt-gobject-domain.c index 180a206..b12a4a0 100644 --- a/libvirt-gobject/libvirt-gobject-domain.c +++ b/libvirt-gobject/libvirt-gobject-domain.c @@ -1597,3 +1597,24 @@ cleanup: free(snapshots); return ret; } + +/** + * gvir_domain_get_snapshots: + * @dom: The domain + * Returns: (element-type LibvirtGObject.DomainSnapshot) (transfer full): A + * list of all the snapshots available for the given domain. The returned + * list should be freed with g_list_free(), after its elements have been + * unreffed with g_object_unref(). + */ +GList *gvir_domain_get_snapshots(GVirDomain *dom) +{ +GList *snapshots = NULL; +g_return_val_if_fail(GVIR_IS_DOMAIN(dom), NULL); + +if (dom->priv->snapshots != NULL) { +snapshots = g_hash_table_get_values(dom->priv->snapshots); +g_list_foreach(snapshots, (GFunc)g_object_ref, NULL); +} + +return snapshots; +} diff --git a/libvirt-gobject/libvirt-gobject-domain.h b/libvirt-gobject/libvirt-gobject-domain.h index 8c1a8e5..22870c1 100644 --- a/libvirt-gobject/libvirt-gobject-domain.h +++ b/libvirt-gobject/libvirt-gobject-domain.h @@ -367,6 +367,10 @@ gboolean gvir_domain_fetch_snapshots(GVirDomain *dom, guint list_flags, GCancellable *cancellable, GError **error); + +GList *gvir_domain_get_snapshots(GVirDomain *dom); + + G_END_DECLS #endif /* __LIBVIRT_GOBJECT_DOMAIN_H__ */ diff --git a/libvirt-gobject/libvirt-gobject.sym b/libvirt-gobject/libvirt-gobject.sym index 781310f..28e547a 100644 --- a/libvirt-gobject/libvirt-gobject.sym +++ b/libvirt-gobject/libvirt-gobject.sym @@ -237,6 +237,7 @@ LIBVIRT_GOBJECT_0.1.5 { LIBVIRT_GOBJECT_0.1.9 { global: gvir_domain_fetch_snapshots; + gvir_domain_get_snapshots; gvir_domain_snapshot_delete; gvir_domain_snapshot_list_flags_get_type; } LIBVIRT_GOBJECT_0.1.5; -- 2.0.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [libvirt-glib] [PATCH v3 2/3] libvirt-gobject-domain: Add _get_snapshots
... which returns a GList of GVirDomainSnapshots, i.e. without any tree structure or other relationship between the snapshots. --- libvirt-gobject/libvirt-gobject-domain.c | 21 + libvirt-gobject/libvirt-gobject-domain.h | 4 libvirt-gobject/libvirt-gobject.sym | 1 + 3 files changed, 26 insertions(+) diff --git a/libvirt-gobject/libvirt-gobject-domain.c b/libvirt-gobject/libvirt-gobject-domain.c index 180a206..b12a4a0 100644 --- a/libvirt-gobject/libvirt-gobject-domain.c +++ b/libvirt-gobject/libvirt-gobject-domain.c @@ -1597,3 +1597,24 @@ cleanup: free(snapshots); return ret; } + +/** + * gvir_domain_get_snapshots: + * @dom: The domain + * Returns: (element-type LibvirtGObject.DomainSnapshot) (transfer full): A + * list of all the snapshots available for the given domain. The returned + * list should be freed with g_list_free(), after its elements have been + * unreffed with g_object_unref(). + */ +GList *gvir_domain_get_snapshots(GVirDomain *dom) +{ +GList *snapshots = NULL; +g_return_val_if_fail(GVIR_IS_DOMAIN(dom), NULL); + +if (dom->priv->snapshots != NULL) { +snapshots = g_hash_table_get_values(dom->priv->snapshots); +g_list_foreach(snapshots, (GFunc)g_object_ref, NULL); +} + +return snapshots; +} diff --git a/libvirt-gobject/libvirt-gobject-domain.h b/libvirt-gobject/libvirt-gobject-domain.h index 8c1a8e5..22870c1 100644 --- a/libvirt-gobject/libvirt-gobject-domain.h +++ b/libvirt-gobject/libvirt-gobject-domain.h @@ -367,6 +367,10 @@ gboolean gvir_domain_fetch_snapshots(GVirDomain *dom, guint list_flags, GCancellable *cancellable, GError **error); + +GList *gvir_domain_get_snapshots(GVirDomain *dom); + + G_END_DECLS #endif /* __LIBVIRT_GOBJECT_DOMAIN_H__ */ diff --git a/libvirt-gobject/libvirt-gobject.sym b/libvirt-gobject/libvirt-gobject.sym index 781310f..28e547a 100644 --- a/libvirt-gobject/libvirt-gobject.sym +++ b/libvirt-gobject/libvirt-gobject.sym @@ -237,6 +237,7 @@ LIBVIRT_GOBJECT_0.1.5 { LIBVIRT_GOBJECT_0.1.9 { global: gvir_domain_fetch_snapshots; + gvir_domain_get_snapshots; gvir_domain_snapshot_delete; gvir_domain_snapshot_list_flags_get_type; } LIBVIRT_GOBJECT_0.1.5; -- 2.0.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [libvirt-glib] [PATCH v3 1/3] libvirt-gobject-domain: Add _fetch_snapshots
This function can be used to fetch the snapshots of a domain (according to the given GVirDomainSnapshotListFlags) and save them in a domain-internal GHashTable. A function to access them from outside will be added in a later patch. --- libvirt-gobject/libvirt-gobject-domain.c | 83 libvirt-gobject/libvirt-gobject-domain.h | 37 ++ libvirt-gobject/libvirt-gobject.sym | 2 + 3 files changed, 122 insertions(+) diff --git a/libvirt-gobject/libvirt-gobject-domain.c b/libvirt-gobject/libvirt-gobject-domain.c index c6e30e5..180a206 100644 --- a/libvirt-gobject/libvirt-gobject-domain.c +++ b/libvirt-gobject/libvirt-gobject-domain.c @@ -38,6 +38,8 @@ struct _GVirDomainPrivate { virDomainPtr handle; gchar uuid[VIR_UUID_STRING_BUFLEN]; +GHashTable *snapshots; +GMutex *lock; }; G_DEFINE_TYPE(GVirDomain, gvir_domain, G_TYPE_OBJECT); @@ -121,6 +123,11 @@ static void gvir_domain_finalize(GObject *object) g_debug("Finalize GVirDomain=%p", domain); +if (priv->snapshots) { +g_hash_table_unref(priv->snapshots); +} +g_mutex_free(priv->lock); + virDomainFree(priv->handle); G_OBJECT_CLASS(gvir_domain_parent_class)->finalize(object); @@ -237,6 +244,7 @@ static void gvir_domain_init(GVirDomain *domain) g_debug("Init GVirDomain=%p", domain); domain->priv = GVIR_DOMAIN_GET_PRIVATE(domain); +domain->priv->lock = g_mutex_new(); } typedef struct virDomain GVirDomainHandle; @@ -1514,3 +1522,78 @@ gvir_domain_create_snapshot(GVirDomain *dom, g_free(custom_xml); return dom_snapshot; } + + + +/** + * gvir_domain_fetch_snapshots: + * @dom: The domain + * @list_flags: bitwise-OR of #GVirDomainSnapshotListFlags + * @cancellable: (allow-none)(transfer-none): cancellation object + * @error: (allow-none): Place-holder for error or NULL + * + * Returns: TRUE on success, FALSE otherwise. + */ +gboolean gvir_domain_fetch_snapshots(GVirDomain *dom, + guint list_flags, + GCancellable *cancellable, + GError **error) +{ +GVirDomainPrivate *priv; +virDomainSnapshotPtr *snapshots = NULL; +GVirDomainSnapshot *snap; +GHashTable *snap_table; +int n_snaps = 0; +int i; +gboolean ret = TRUE; + +g_return_val_if_fail(GVIR_IS_DOMAIN(dom), FALSE); +g_return_val_if_fail((error == NULL) || (*error == NULL), FALSE); + +priv = dom->priv; + +snap_table = g_hash_table_new_full(g_str_hash, + g_str_equal, + NULL, + g_object_unref); + + +n_snaps = virDomainListAllSnapshots(priv->handle, &snapshots, list_flags); + +if (g_cancellable_set_error_if_cancelled(cancellable, error)) { +ret = FALSE; +goto cleanup; +} + +if (n_snaps < 0) { +gvir_set_error(error, GVIR_DOMAIN_ERROR, 0, + "Unable to fetch snapshots of %s", + gvir_domain_get_name(dom)); +ret = FALSE; +goto cleanup; +} + +for (i = 0; i < n_snaps; i ++) { +if (g_cancellable_set_error_if_cancelled(cancellable, error)) { +ret = FALSE; +goto cleanup; +} +snap = GVIR_DOMAIN_SNAPSHOT(g_object_new(GVIR_TYPE_DOMAIN_SNAPSHOT, + "handle", snapshots[i], + NULL)); +g_hash_table_insert(snap_table, +(gpointer)gvir_domain_snapshot_get_name(snap), +snap); +} + + +g_mutex_lock(priv->lock); +if (priv->snapshots != NULL) +g_hash_table_unref(priv->snapshots); +priv->snapshots = snap_table; +g_mutex_unlock(priv->lock); + +cleanup: +free(snapshots); +return ret; +} diff --git a/libvirt-gobject/libvirt-gobject-domain.h b/libvirt-gobject/libvirt-gobject-domain.h index 38d3458..8c1a8e5 100644 --- a/libvirt-gobject/libvirt-gobject-domain.h +++ b/libvirt-gobject/libvirt-gobject-domain.h @@ -183,6 +183,39 @@ typedef enum { GVIR_DOMAIN_REBOOT_GUEST_AGENT= VIR_DOMAIN_REBOOT_GUEST_AGENT, } GVirDomainRebootFlags; +/** + * GVirDomainSnapshotListFlags: + * @GVIR_DOMAIN_SNAPSHOT_LIST_ALL: List all snapshots + * @GVIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS: List all descendants, not just + * children, when listing a snapshot. + * For historical reasons, groups do not use contiguous bits. + * @GVIR_DOMAIN_SNAPSHOT_LIST_ROOTS: Filter by snapshots with no parents, when listing a domain + * @GVIR_DOMAIN_SNAPSHOT_LIST_METADATA: Filter by snapshots which have metadata + * @GVIR_DOMAIN_SNAPSHOT_LIST_LEAVES: Filter by snapshots with no children + * @GVIR_DOMAIN_SNAPSHOT_LIST_NO_LEAVES: Filter by snapshots that have children
[libvirt] [libvirt-glib] [PATCH v3 0/3] Add API to fetch snapshots
This patchset replaces the old one and includes gvir_domain_fetch_snapshtos_async as well as a version of gvir_domain_fetch_snapshots that works with it. Timm Bäder (3): libvirt-gobject-domain: Add _fetch_snapshots libvirt-gobject-domain: Add _get_snapshots GVirDomain: Add async version of _fetch_snapshots libvirt-gobject/libvirt-gobject-domain.c | 164 +++ libvirt-gobject/libvirt-gobject-domain.h | 51 ++ libvirt-gobject/libvirt-gobject.sym | 5 + 3 files changed, 220 insertions(+) -- 2.0.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [libvirt-glib] [PATCHv2 2/2] libvirt-gobject-domain: Add _get_snapshots
... which returns a GList of GVirDomainSnapshots, i.e. without any tree structure or other relationship between the snapshots. --- libvirt-gobject/libvirt-gobject-domain.c | 21 + libvirt-gobject/libvirt-gobject-domain.h | 4 libvirt-gobject/libvirt-gobject.sym | 1 + 3 files changed, 26 insertions(+) diff --git a/libvirt-gobject/libvirt-gobject-domain.c b/libvirt-gobject/libvirt-gobject-domain.c index a527d4e..e4c99ed 100644 --- a/libvirt-gobject/libvirt-gobject-domain.c +++ b/libvirt-gobject/libvirt-gobject-domain.c @@ -1575,3 +1575,24 @@ gboolean gvir_domain_fetch_snapshots(GVirDomain *dom, free(snapshots); return TRUE; } + +/** + * gvir_domain_get_snapshots: + * @dom: The domain + * Returns: (element-type LibvirtGObject.DomainSnapshot) (transfer full): A + * list of all the snapshots available for the given domain. The returned + * list should be freed with g_list_free(), after its elements have been + * unreffed with g_object_unref(). + */ +GList *gvir_domain_get_snapshots(GVirDomain *dom) +{ +GList *snapshots = NULL; +g_return_val_if_fail(GVIR_IS_DOMAIN(dom), NULL); + +if (dom->priv->snapshots != NULL) { +snapshots = g_hash_table_get_values(dom->priv->snapshots); +g_list_foreach(snapshots, (GFunc)g_object_ref, NULL); +} + +return snapshots; +} diff --git a/libvirt-gobject/libvirt-gobject-domain.h b/libvirt-gobject/libvirt-gobject-domain.h index fb33e2b..acea7c2 100644 --- a/libvirt-gobject/libvirt-gobject-domain.h +++ b/libvirt-gobject/libvirt-gobject-domain.h @@ -366,6 +366,10 @@ gvir_domain_create_snapshot(GVirDomain *dom, gboolean gvir_domain_fetch_snapshots(GVirDomain *dom, guint flags, GError **error); + +GList *gvir_domain_get_snapshots(GVirDomain *dom); + + G_END_DECLS #endif /* __LIBVIRT_GOBJECT_DOMAIN_H__ */ diff --git a/libvirt-gobject/libvirt-gobject.sym b/libvirt-gobject/libvirt-gobject.sym index 781310f..28e547a 100644 --- a/libvirt-gobject/libvirt-gobject.sym +++ b/libvirt-gobject/libvirt-gobject.sym @@ -237,6 +237,7 @@ LIBVIRT_GOBJECT_0.1.5 { LIBVIRT_GOBJECT_0.1.9 { global: gvir_domain_fetch_snapshots; + gvir_domain_get_snapshots; gvir_domain_snapshot_delete; gvir_domain_snapshot_list_flags_get_type; } LIBVIRT_GOBJECT_0.1.5; -- 2.0.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [libvirt-glib] [PATCHv2 1/2] libvirt-gobject-domain: Add _fetch_snapshots
This function can be used to fetch the snapshots of a domain (according to the given GVirDomainSnapshotListFlags) and save them in a domain-internal GHashTable. A function to access them from outside will be added in a later patch. --- libvirt-gobject/libvirt-gobject-domain.c | 61 libvirt-gobject/libvirt-gobject-domain.h | 36 +++ libvirt-gobject/libvirt-gobject.sym | 2 ++ 3 files changed, 99 insertions(+) diff --git a/libvirt-gobject/libvirt-gobject-domain.c b/libvirt-gobject/libvirt-gobject-domain.c index c6e30e5..a527d4e 100644 --- a/libvirt-gobject/libvirt-gobject-domain.c +++ b/libvirt-gobject/libvirt-gobject-domain.c @@ -38,6 +38,7 @@ struct _GVirDomainPrivate { virDomainPtr handle; gchar uuid[VIR_UUID_STRING_BUFLEN]; +GHashTable *snapshots; }; G_DEFINE_TYPE(GVirDomain, gvir_domain, G_TYPE_OBJECT); @@ -121,6 +122,10 @@ static void gvir_domain_finalize(GObject *object) g_debug("Finalize GVirDomain=%p", domain); +if (priv->snapshots) { +g_hash_table_unref (priv->snapshots); +} + virDomainFree(priv->handle); G_OBJECT_CLASS(gvir_domain_parent_class)->finalize(object); @@ -1514,3 +1519,59 @@ gvir_domain_create_snapshot(GVirDomain *dom, g_free(custom_xml); return dom_snapshot; } + + + +/** + * gvir_domain_fetch_snapshots: + * @dom: The domain + * @list_flags: bitwise-OR of #GVirDomainSnapshotListFlags + * @error: (allow-none): Place-holder for error or NULL + * + * Returns: TRUE on success, FALSE otherwise. + */ +gboolean gvir_domain_fetch_snapshots(GVirDomain *dom, + guint list_flags, + GError **error) +{ +GVirDomainPrivate *priv; +virDomainSnapshotPtr *snapshots = NULL; +GVirDomainSnapshot *snap; +int n_snaps = 0; +int i; + +g_return_val_if_fail(GVIR_IS_DOMAIN(dom), FALSE); +g_return_val_if_fail((error == NULL) || (*error == NULL), FALSE); + +priv = dom->priv; + +if (priv->snapshots != NULL) { +g_hash_table_unref (priv->snapshots); +} + +priv->snapshots = g_hash_table_new_full(g_str_hash, +g_str_equal, +NULL, +g_object_unref); + + +n_snaps = virDomainListAllSnapshots(priv->handle, &snapshots, list_flags); + +if (n_snaps < 0) { +gvir_set_error(error, GVIR_DOMAIN_ERROR, 0, + "Unable to fetch snapshots of %s", + gvir_domain_get_name (dom)); +return FALSE; +} + +for (i = 0; i < n_snaps; i ++) { +snap = GVIR_DOMAIN_SNAPSHOT(g_object_new(GVIR_TYPE_DOMAIN_SNAPSHOT, + "handle", snapshots[i], + NULL)); +g_hash_table_insert(priv->snapshots, +(gpointer)gvir_domain_snapshot_get_name(snap), +snap); +} +free(snapshots); +return TRUE; +} diff --git a/libvirt-gobject/libvirt-gobject-domain.h b/libvirt-gobject/libvirt-gobject-domain.h index 38d3458..fb33e2b 100644 --- a/libvirt-gobject/libvirt-gobject-domain.h +++ b/libvirt-gobject/libvirt-gobject-domain.h @@ -183,6 +183,39 @@ typedef enum { GVIR_DOMAIN_REBOOT_GUEST_AGENT= VIR_DOMAIN_REBOOT_GUEST_AGENT, } GVirDomainRebootFlags; +/** + * GVirDomainSnapshotListFlags: + * @GVIR_DOMAIN_SNAPSHOT_LIST_ALL: List all snapshots + * @GVIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS: List all descendants, not just + * children, when listing a snapshot. + * For historical reasons, groups do not use contiguous bits. + * @GVIR_DOMAIN_SNAPSHOT_LIST_ROOTS: Filter by snapshots with no parents, when listing a domain + * @GVIR_DOMAIN_SNAPSHOT_LIST_METADATA: Filter by snapshots which have metadata + * @GVIR_DOMAIN_SNAPSHOT_LIST_LEAVES: Filter by snapshots with no children + * @GVIR_DOMAIN_SNAPSHOT_LIST_NO_LEAVES: Filter by snapshots that have children + * @GVIR_DOMAIN_SNAPSHOT_LIST_NO_METADATA: Filter by snapshots with no metadata + * @GVIR_DOMAIN_SNAPSHOT_LIST_INACTIVE: Filter by snapshots taken while guest was shut off + * @GVIR_DOMAIN_SNAPSHOT_LIST_ACTIVE: Filter by snapshots taken while guest was active, and with memory state + * @GVIR_DOMAIN_SNAPSHOT_LIST_DISK_ONLY: Filter by snapshots taken while guest was active, but without memory state + * @GVIR_DOMAIN_SNAPSHOT_LIST_INTERNAL: Filter by snapshots stored internal to disk images + * @GVIR_DOMAIN_SNAPSHOT_LIST_EXTERNAL: Filter by snapshots that use files external to disk images + */ +typedef enum { +GVIR_DOMAIN_SNAPSHOT_LIST_ALL = 0, +GVIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS = VIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS, +GVIR_DOMAIN_SNAPSHOT_LIST_ROOTS = VIR_DOMAIN_SNAPSHOT_LIST_ROOTS, +GVIR_DOMAIN_S
[libvirt] [libvirt-glib] [PATCH 0/2] Add API to fetch the snapshots of a GVirDomain
The following two patches add gvir_domain_fetch_snapshots which uses virDomainListAllSnapshots to fetch snapshots from the virDomain (using the given GVirDomainSnapshotListFlags) and gvir_domain_get_snapshots which returns a GList of containing all of the snapshots last fetched. Timm Bäder (2): libvirt-gobject-domain: Add _fetch_snapshots libvirt-gobject-domain: Add _get_snapshots libvirt-gobject/libvirt-gobject-domain.c | 80 libvirt-gobject/libvirt-gobject-domain.h | 40 libvirt-gobject/libvirt-gobject.sym | 3 ++ 3 files changed, 123 insertions(+) -- 2.0.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [libvirt-glib] [PATCH 1/2] libvirt-gobject-domain: Add _fetch_snapshots
This function can be used to fetch the snapshots of a domain (according to the given GVirDomainSnapshotListFlags) and save them in a domain-internal GHashTable. A function to access them from outside will be added in a later patch. --- libvirt-gobject/libvirt-gobject-domain.c | 59 libvirt-gobject/libvirt-gobject-domain.h | 36 +++ libvirt-gobject/libvirt-gobject.sym | 2 ++ 3 files changed, 97 insertions(+) diff --git a/libvirt-gobject/libvirt-gobject-domain.c b/libvirt-gobject/libvirt-gobject-domain.c index c6e30e5..f6b5837 100644 --- a/libvirt-gobject/libvirt-gobject-domain.c +++ b/libvirt-gobject/libvirt-gobject-domain.c @@ -38,6 +38,7 @@ struct _GVirDomainPrivate { virDomainPtr handle; gchar uuid[VIR_UUID_STRING_BUFLEN]; +GHashTable *snapshots; }; G_DEFINE_TYPE(GVirDomain, gvir_domain, G_TYPE_OBJECT); @@ -121,6 +122,8 @@ static void gvir_domain_finalize(GObject *object) g_debug("Finalize GVirDomain=%p", domain); +g_hash_table_unref (priv->snapshots); + virDomainFree(priv->handle); G_OBJECT_CLASS(gvir_domain_parent_class)->finalize(object); @@ -1514,3 +1517,59 @@ gvir_domain_create_snapshot(GVirDomain *dom, g_free(custom_xml); return dom_snapshot; } + + + +/** + * gvir_domain_fetch_snapshots: + * @dom: The domain + * @list_flags: bitwise-OR of #GVirDomainSnapshotListFlags + * @error: (allow-none): Place-holder for error or NULL + * + * Returns: TRUE on success, FALSE otherwise. + */ +gboolean gvir_domain_fetch_snapshots(GVirDomain *dom, + guint list_flags, + GError **error) +{ +GVirDomainPrivate *priv; +virDomainSnapshotPtr *snapshots = NULL; +GVirDomainSnapshot *snap; +int n_snaps = 0; +int i; + +g_return_val_if_fail(GVIR_IS_DOMAIN(dom), FALSE); +g_return_val_if_fail((error == NULL) || (*error == NULL), FALSE); + +priv = dom->priv; + +if (priv->snapshots != NULL) { +g_hash_table_destroy (priv->snapshots); +} + +priv->snapshots = g_hash_table_new_full(g_str_hash, +g_str_equal, +g_free, +g_object_unref); + + +n_snaps = virDomainListAllSnapshots(priv->handle, &snapshots, list_flags); + +if (n_snaps < 0) { +gvir_set_error(error, GVIR_DOMAIN_ERROR, 0, + "Unable to fetch snapshots of %s", + gvir_domain_get_name (dom)); +return FALSE; +} + +for (i = 0; i < n_snaps; i ++) { +snap = GVIR_DOMAIN_SNAPSHOT(g_object_new(GVIR_TYPE_DOMAIN_SNAPSHOT, + "handle", snapshots[i], + NULL)); +g_hash_table_insert(priv->snapshots, +(gpointer)gvir_domain_snapshot_get_name(snap), +snap); +} +g_free(snapshots); +return TRUE; +} diff --git a/libvirt-gobject/libvirt-gobject-domain.h b/libvirt-gobject/libvirt-gobject-domain.h index 38d3458..fb33e2b 100644 --- a/libvirt-gobject/libvirt-gobject-domain.h +++ b/libvirt-gobject/libvirt-gobject-domain.h @@ -183,6 +183,39 @@ typedef enum { GVIR_DOMAIN_REBOOT_GUEST_AGENT= VIR_DOMAIN_REBOOT_GUEST_AGENT, } GVirDomainRebootFlags; +/** + * GVirDomainSnapshotListFlags: + * @GVIR_DOMAIN_SNAPSHOT_LIST_ALL: List all snapshots + * @GVIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS: List all descendants, not just + * children, when listing a snapshot. + * For historical reasons, groups do not use contiguous bits. + * @GVIR_DOMAIN_SNAPSHOT_LIST_ROOTS: Filter by snapshots with no parents, when listing a domain + * @GVIR_DOMAIN_SNAPSHOT_LIST_METADATA: Filter by snapshots which have metadata + * @GVIR_DOMAIN_SNAPSHOT_LIST_LEAVES: Filter by snapshots with no children + * @GVIR_DOMAIN_SNAPSHOT_LIST_NO_LEAVES: Filter by snapshots that have children + * @GVIR_DOMAIN_SNAPSHOT_LIST_NO_METADATA: Filter by snapshots with no metadata + * @GVIR_DOMAIN_SNAPSHOT_LIST_INACTIVE: Filter by snapshots taken while guest was shut off + * @GVIR_DOMAIN_SNAPSHOT_LIST_ACTIVE: Filter by snapshots taken while guest was active, and with memory state + * @GVIR_DOMAIN_SNAPSHOT_LIST_DISK_ONLY: Filter by snapshots taken while guest was active, but without memory state + * @GVIR_DOMAIN_SNAPSHOT_LIST_INTERNAL: Filter by snapshots stored internal to disk images + * @GVIR_DOMAIN_SNAPSHOT_LIST_EXTERNAL: Filter by snapshots that use files external to disk images + */ +typedef enum { +GVIR_DOMAIN_SNAPSHOT_LIST_ALL = 0, +GVIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS = VIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS, +GVIR_DOMAIN_SNAPSHOT_LIST_ROOTS = VIR_DOMAIN_SNAPSHOT_LIST_ROOTS, +GVIR_DOMAIN_SNAPSHOT_LIST_METADATA= VIR_DOM
[libvirt] [libvirt-glib] [PATCH 2/2] libvirt-gobject-domain: Add _get_snapshots
... which returns a GList of GVirDomainSnapshots, i.e. without any tree structure or other relationship between the snapshots. --- libvirt-gobject/libvirt-gobject-domain.c | 21 + libvirt-gobject/libvirt-gobject-domain.h | 4 libvirt-gobject/libvirt-gobject.sym | 1 + 3 files changed, 26 insertions(+) diff --git a/libvirt-gobject/libvirt-gobject-domain.c b/libvirt-gobject/libvirt-gobject-domain.c index f6b5837..2da99df 100644 --- a/libvirt-gobject/libvirt-gobject-domain.c +++ b/libvirt-gobject/libvirt-gobject-domain.c @@ -1573,3 +1573,24 @@ gboolean gvir_domain_fetch_snapshots(GVirDomain *dom, g_free(snapshots); return TRUE; } + +/** + * gvir_domain_get_snapshots: + * @dom: The domain + * Returns: (element-type LibvirtGObject.DomainSnapshot) (transfer full): A list of + * all the snapshots available for the given domain. The returned list + * should be freed with g_list_free(), after its elements have been unreffed + * with g_object_unref(). + */ +GList *gvir_domain_get_snapshots(GVirDomain *dom) +{ +GList *snapshots = NULL; +g_return_val_if_fail(GVIR_IS_DOMAIN(dom), NULL); + +if (dom->priv->snapshots != NULL) { +snapshots = g_hash_table_get_values(dom->priv->snapshots); +g_list_foreach(snapshots, (GFunc)g_object_ref, NULL); +} + +return snapshots; +} diff --git a/libvirt-gobject/libvirt-gobject-domain.h b/libvirt-gobject/libvirt-gobject-domain.h index fb33e2b..acea7c2 100644 --- a/libvirt-gobject/libvirt-gobject-domain.h +++ b/libvirt-gobject/libvirt-gobject-domain.h @@ -366,6 +366,10 @@ gvir_domain_create_snapshot(GVirDomain *dom, gboolean gvir_domain_fetch_snapshots(GVirDomain *dom, guint flags, GError **error); + +GList *gvir_domain_get_snapshots(GVirDomain *dom); + + G_END_DECLS #endif /* __LIBVIRT_GOBJECT_DOMAIN_H__ */ diff --git a/libvirt-gobject/libvirt-gobject.sym b/libvirt-gobject/libvirt-gobject.sym index 781310f..28e547a 100644 --- a/libvirt-gobject/libvirt-gobject.sym +++ b/libvirt-gobject/libvirt-gobject.sym @@ -237,6 +237,7 @@ LIBVIRT_GOBJECT_0.1.5 { LIBVIRT_GOBJECT_0.1.9 { global: gvir_domain_fetch_snapshots; + gvir_domain_get_snapshots; gvir_domain_snapshot_delete; gvir_domain_snapshot_list_flags_get_type; } LIBVIRT_GOBJECT_0.1.5; -- 2.0.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [libvirt-glib] [PATCH v3] GVirDomainSnapshot: Add gvir_domain_snapshot_delete
--- libvirt-gobject/libvirt-gobject-domain-snapshot.c | 29 +++ libvirt-gobject/libvirt-gobject-domain-snapshot.h | 16 + libvirt-gobject/libvirt-gobject.sym | 6 + 3 files changed, 51 insertions(+) diff --git a/libvirt-gobject/libvirt-gobject-domain-snapshot.c b/libvirt-gobject/libvirt-gobject-domain-snapshot.c index fcf70ed..f835b58 100644 --- a/libvirt-gobject/libvirt-gobject-domain-snapshot.c +++ b/libvirt-gobject/libvirt-gobject-domain-snapshot.c @@ -205,3 +205,32 @@ GVirConfigDomainSnapshot *gvir_domain_snapshot_get_config free(xml); return conf; } + +/** + * gvir_domain_snapshot_delete: + * @snapshot: The domain snapshot + * @flags: Bitwise or of #GVirDomainSnapshotDeleteFlags + * @error: (allow-none): Place-holder for error or NULL + * + * Returns: TRUE on success, FALSE otherwise + */ +gboolean gvir_domain_snapshot_delete (GVirDomainSnapshot *snapshot, + guint flags, + GError **error) +{ +GVirDomainSnapshotPrivate *priv; +int status; + +g_return_if_fail(GVIR_IS_DOMAIN_SNAPSHOT (snapshot)); +g_return_if_fail(error == NULL || *error == NULL); + +priv = snapshot->priv; +status = virDomainSnapshotDelete(priv->handle, flags); +if (status < 0) { +gvir_set_error(error, GVIR_DOMAIN_SNAPSHOT_ERROR, 0, + "Unable to delete snapshot `%s'", + gvir_domain_snapshot_get_name(snapshot)); +return FALSE; +} +return TRUE; +} diff --git a/libvirt-gobject/libvirt-gobject-domain-snapshot.h b/libvirt-gobject/libvirt-gobject-domain-snapshot.h index 5bd827c..b3ebe7f 100644 --- a/libvirt-gobject/libvirt-gobject-domain-snapshot.h +++ b/libvirt-gobject/libvirt-gobject-domain-snapshot.h @@ -58,6 +58,18 @@ struct _GVirDomainSnapshotClass gpointer padding[20]; }; +/** + * GVirDomainSnapshotDeleteFlags: + * @GVIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN: Also delete children + * @GVIR_DOMAIN_SNAPSHOT_DELETE_METADATA_ONLY: Delete just metadata + * @GVIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN_ONLY: Delete just children + */ +typedef enum { + GVIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN = 1, + GVIR_DOMAIN_SNAPSHOT_DELETE_METADATA_ONLY = 2, + GVIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN_ONLY = 4 +} GVirDomainSnapshotDeleteFlags; + GType gvir_domain_snapshot_get_type(void); GType gvir_domain_snapshot_handle_get_type(void); @@ -69,6 +81,10 @@ GVirConfigDomainSnapshot *gvir_domain_snapshot_get_config guint flags, GError **err); +gboolean gvir_domain_snapshot_delete (GVirDomainSnapshot *snapshot, + guint flags, + GError **error); + G_END_DECLS #endif /* __LIBVIRT_GOBJECT_DOMAIN_SNAPSHOT_H__ */ diff --git a/libvirt-gobject/libvirt-gobject.sym b/libvirt-gobject/libvirt-gobject.sym index f2419ac..232e63b 100644 --- a/libvirt-gobject/libvirt-gobject.sym +++ b/libvirt-gobject/libvirt-gobject.sym @@ -234,4 +234,10 @@ LIBVIRT_GOBJECT_0.1.5 { gvir_connection_open_read_only_finish; } LIBVIRT_GOBJECT_0.1.4; +LIBVIRT_GOBJECT_0.1.9 { + global: + gvir_domain_snapshot_delete_flags_get_type; + gvir_domain_snapshot_delete; +} LIBVIRT_GOBJECT_0.1.5; + # define new API here using predicted next version number -- 2.0.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [libvirt-glib] [PATCH v2] GVirDomainSnapshot: Add gvir_domain_snapshot_delete
--- Whoops, totally forgot about the delete flags in the first version, sorry. As for the underline in domain_snapshot, I took that from gvir_domain_snapshot_get_config so I don't really know what's the correct version. Since this is using gvir_domain_snapshot_get_name now, the patch removing the #if 0's in libvirt-gobject-domain-snapshot.c is needed. libvirt-gobject/libvirt-gobject-domain-snapshot.c | 25 +++ libvirt-gobject/libvirt-gobject-domain-snapshot.h | 16 +++ libvirt-gobject/libvirt-gobject.sym | 6 ++ 3 files changed, 47 insertions(+) diff --git a/libvirt-gobject/libvirt-gobject-domain-snapshot.c b/libvirt-gobject/libvirt-gobject-domain-snapshot.c index fcf70ed..aa0504d 100644 --- a/libvirt-gobject/libvirt-gobject-domain-snapshot.c +++ b/libvirt-gobject/libvirt-gobject-domain-snapshot.c @@ -205,3 +205,28 @@ GVirConfigDomainSnapshot *gvir_domain_snapshot_get_config free(xml); return conf; } + +/** + * gvir_domain_snapshot_delete: + * @snapshot: the domain snapshot + * @flags: Bitwise or of #GVirDomainSnapshotDeleteFlags + * @error: (allow-none): Place-holder for error or NULL + */ +void gvir_domain_snapshot_delete (GVirDomainSnapshot *snapshot, + GVirDomainSnapshotDeleteFlags flags, + GError **error) +{ +GVirDomainSnapshotPrivate *priv; +int status; + +g_return_if_fail(GVIR_IS_DOMAIN_SNAPSHOT (snapshot)); +g_return_if_fail(error == NULL || *error == NULL); + +priv = snapshot->priv; +status = virDomainSnapshotDelete(priv->handle, flags); +if (status < 0) { +gvir_set_error(error, GVIR_DOMAIN_SNAPSHOT_ERROR, 0, + "Unable to delete snapshot `%s'", + gvir_domain_snapshot_get_name(snapshot)); +} +} diff --git a/libvirt-gobject/libvirt-gobject-domain-snapshot.h b/libvirt-gobject/libvirt-gobject-domain-snapshot.h index 5bd827c..3985795 100644 --- a/libvirt-gobject/libvirt-gobject-domain-snapshot.h +++ b/libvirt-gobject/libvirt-gobject-domain-snapshot.h @@ -58,6 +58,18 @@ struct _GVirDomainSnapshotClass gpointer padding[20]; }; +/** + * GVirDomainSnapshotDeleteFlags: + * @GVIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN: Also delete children + * @GVIR_DOMAIN_SNAPSHOT_DELETE_METADATA_ONLY: Delete just metadata + * @GVIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN_ONLY: Delete just children + */ +typedef enum { + GVIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN = 1, + GVIR_DOMAIN_SNAPSHOT_DELETE_METADATA_ONLY = 2, + GVIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN_ONLY = 4 +} GVirDomainSnapshotDeleteFlags; + GType gvir_domain_snapshot_get_type(void); GType gvir_domain_snapshot_handle_get_type(void); @@ -69,6 +81,10 @@ GVirConfigDomainSnapshot *gvir_domain_snapshot_get_config guint flags, GError **err); +void gvir_domain_snapshot_delete (GVirDomainSnapshot *snapshot, + guint flags, + GError **error); + G_END_DECLS #endif /* __LIBVIRT_GOBJECT_DOMAIN_SNAPSHOT_H__ */ diff --git a/libvirt-gobject/libvirt-gobject.sym b/libvirt-gobject/libvirt-gobject.sym index f2419ac..232e63b 100644 --- a/libvirt-gobject/libvirt-gobject.sym +++ b/libvirt-gobject/libvirt-gobject.sym @@ -234,4 +234,10 @@ LIBVIRT_GOBJECT_0.1.5 { gvir_connection_open_read_only_finish; } LIBVIRT_GOBJECT_0.1.4; +LIBVIRT_GOBJECT_0.1.9 { + global: + gvir_domain_snapshot_delete_flags_get_type; + gvir_domain_snapshot_delete; +} LIBVIRT_GOBJECT_0.1.5; + # define new API here using predicted next version number -- 1.9.3 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [libvirt-glib] [PATCH] GVirDomainSnapshot: add gvir_domain_snapshot_delete
--- libvirt-gobject/libvirt-gobject-domain-snapshot.c | 21 + libvirt-gobject/libvirt-gobject-domain-snapshot.h | 3 +++ libvirt-gobject/libvirt-gobject.sym | 5 + 3 files changed, 29 insertions(+) diff --git a/libvirt-gobject/libvirt-gobject-domain-snapshot.c b/libvirt-gobject/libvirt-gobject-domain-snapshot.c index ab23342..f46c99b 100644 --- a/libvirt-gobject/libvirt-gobject-domain-snapshot.c +++ b/libvirt-gobject/libvirt-gobject-domain-snapshot.c @@ -206,3 +206,24 @@ GVirConfigDomainSnapshot *gvir_domain_snapshot_get_config free(xml); return conf; } + +/** + * gvir_domain_snapshot_delete: + * @snapshot: the domain_snapshot + * @error: (allow-none): Place-holder for error or NULL + */ +void gvir_domain_snapshot_delete(GVirDomainSnapshot *snapshot, GError **error) +{ +GVirDomainSnapshotPrivate *priv; +int status; + +g_return_if_fail(GVIR_IS_DOMAIN_SNAPSHOT (snapshot)); +g_return_if_fail(error == NULL || *error == NULL); + +priv = snapshot->priv; +status = virDomainSnapshotDelete(priv->handle, 0); +if (status < 0) { +gvir_set_error_literal(error, GVIR_DOMAIN_SNAPSHOT_ERROR, 0, + "Unable to delete snapshot"); +} +} diff --git a/libvirt-gobject/libvirt-gobject-domain-snapshot.h b/libvirt-gobject/libvirt-gobject-domain-snapshot.h index 5bd827c..575f56f 100644 --- a/libvirt-gobject/libvirt-gobject-domain-snapshot.h +++ b/libvirt-gobject/libvirt-gobject-domain-snapshot.h @@ -69,6 +69,9 @@ GVirConfigDomainSnapshot *gvir_domain_snapshot_get_config guint flags, GError **err); +void gvir_domain_snapshot_delete (GVirDomainSnapshot *snapshot, GError **error); + + G_END_DECLS #endif /* __LIBVIRT_GOBJECT_DOMAIN_SNAPSHOT_H__ */ diff --git a/libvirt-gobject/libvirt-gobject.sym b/libvirt-gobject/libvirt-gobject.sym index f2419ac..5d12a6a 100644 --- a/libvirt-gobject/libvirt-gobject.sym +++ b/libvirt-gobject/libvirt-gobject.sym @@ -234,4 +234,9 @@ LIBVIRT_GOBJECT_0.1.5 { gvir_connection_open_read_only_finish; } LIBVIRT_GOBJECT_0.1.4; +LIBVIRT_GOBJECT_0.1.9 { + global: + gvir_domain_shapshot_delete; +} LIBVIRT_GOBJECT_0.1.5; + # define new API here using predicted next version number -- 1.9.3 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [libvirt-glib] [PATCH] Remove #if 0's from libvirt-gobject-domain-snapshot
On 21.05, Daniel P. Berrange wrote: > On Tue, May 20, 2014 at 08:56:24PM +0200, Timm Bäder wrote: > > The code seems to be fine. > > --- > > > > I'd like to use this code (in later patches). If anything is wrong > > with the current implementation, I'd like to know so I can fix it. > > This is just historical cruft. IIRC, I had #if 0'd it, because at the > time I wrote this, virDomainSnapshotRef didn't exist, but this is long > since added. > > > Regards, > Daniel Well, that's even better, thanks. Is that patch OK in its current form? -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [libvirt-glib] [PATCH] Remove #if 0's from libvirt-gobject-domain-snapshot
The code seems to be fine. --- I'd like to use this code (in later patches). If anything is wrong with the current implementation, I'd like to know so I can fix it. libvirt-gobject/libvirt-gobject-domain-snapshot.c | 10 +- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/libvirt-gobject/libvirt-gobject-domain-snapshot.c b/libvirt-gobject/libvirt-gobject-domain-snapshot.c index d4e9b97..ab23342 100644 --- a/libvirt-gobject/libvirt-gobject-domain-snapshot.c +++ b/libvirt-gobject/libvirt-gobject-domain-snapshot.c @@ -144,9 +144,7 @@ typedef struct virDomainSnapshot GVirDomainSnapshotHandle; static GVirDomainSnapshotHandle* gvir_domain_snapshot_handle_copy(GVirDomainSnapshotHandle *src) { -#if 0 virDomainSnapshotRef((virDomainSnapshotPtr)src); -#endif return src; } @@ -162,7 +160,7 @@ G_DEFINE_BOXED_TYPE(GVirDomainSnapshotHandle, gvir_domain_snapshot_handle, const gchar *gvir_domain_snapshot_get_name(GVirDomainSnapshot *snapshot) { g_return_val_if_fail(GVIR_IS_DOMAIN_SNAPSHOT(snapshot), NULL); -#if 0 + GVirDomainSnapshotPrivate *priv = snapshot->priv; const char *name; @@ -172,12 +170,6 @@ const gchar *gvir_domain_snapshot_get_name(GVirDomainSnapshot *snapshot) } return name; -#else -if (snapshot) -return NULL; -#endif - -g_return_val_if_reached(NULL); } -- 1.9.3 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list