[libvirt] [libvirt-glib] [PATCHv2 1/2] libvirt-gobject-domain: Add _fetch_snapshots

2014-06-27 Thread Timm Bäder
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,
+

Re: [libvirt] [libvirt-glib] [PATCHv2 1/2] libvirt-gobject-domain: Add _fetch_snapshots

2014-06-27 Thread Christophe Fergeau
On Fri, Jun 27, 2014 at 04:35:06PM +0200, Timm Bäder wrote:
 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;

It looks like the declaration of 'snap' can be moved to the inner for()
block.

ACK with this changed (I'll do it before pushing if you don't have push
access to libvirt.org).

Christophe


pgp84hus0Fmom.pgp
Description: PGP signature
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list