[libvirt] [glib PATCH V6] Add bindings for virDomainRestore*()

Zeeshan Ali (Khattak) zeeshanak at gnome.org
Sat Jul 14 01:29:33 UTC 2012


Hi,
  I don't understand this patch. It neither applies on top of your
virDomainSave*() patch, nor its parent commit. Apart from some of the
same issues I saw in the other patch, I see some weird stuff that I
didn't quite understand:

On Fri, Jul 13, 2012 at 7:43 AM, Jovanka Gulicoska
<jovanka.gulicoska at gmail.com> wrote:
> ---
>  libvirt-gobject/libvirt-gobject-connection.c |  137 ++++++++++++++++++++++++++
>  libvirt-gobject/libvirt-gobject-connection.h |   20 ++++
>  libvirt-gobject/libvirt-gobject-domain.c     |   22 ++---
>  libvirt-gobject/libvirt-gobject-domain.h     |   10 ++
>  libvirt-gobject/libvirt-gobject.sym          |    4 +
>  5 files changed, 180 insertions(+), 13 deletions(-)
>
> diff --git a/libvirt-gobject/libvirt-gobject-connection.c b/libvirt-gobject/libvirt-gobject-connection.c
> index 3a99034..5f21c11 100644
> --- a/libvirt-gobject/libvirt-gobject-connection.c
> +++ b/libvirt-gobject/libvirt-gobject-connection.c
> @@ -1605,3 +1605,140 @@ gvir_connection_get_capabilities_finish(GVirConnection *conn,
>
>      return g_object_ref(caps);
>  }
> +
> +/**
> + * gvir_connection_domain_restore:
> + * @conn: a #GVirConnection
> + * @filename: path to input file
> + * @custom_conf: (allow-none): configuration for domain or NULL
> + * @flags: the flags
> + *
> + * Returns: TRUE on success, FALSE otherwise
> + */
> +gboolean gvir_connection_domain_restore(GVirConnection *conn,
> +                                        gchar *filename,
> +                                        GVirConfigDomain *custom_conf,
> +                                        guint flags,
> +                                        GError **err)
> +{
> +    GVirConnectionPrivate *priv;
> +    int ret;
> +
> +    g_return_val_if_fail(GVIR_IS_CONNECTION(conn), FALSE);
> +    g_return_val_if_fail((err == NULL) || (*err == NULL), FALSE);
> +
> +    priv = conn->priv;
> +
> +    if (flags || custom_conf != NULL) {
> +        gchar *custom_xml = NULL;
> +
> +        if (custom_conf != NULL)
> +            custom_xml = gvir_config_object_to_xml(GVIR_CONFIG_OBJECT(custom_conf));
> +
> +       ret = virDomainRestoreFlags(priv->conn, filename, custom_xml, flags);
> +       g_free (custom_xml);
> +    }
> +    else {
> +       ret = virDomainRestore(priv->conn, filename);
> +    }
> +
> +    if (ret < 0) {
> +        gvir_set_error_literal(err, GVIR_CONNECTION_ERROR,
> +                               0,
> +                               "Unable to restore domain");
> +
> +        return FALSE;
> +    }
> +
> +    return TRUE;
> +}
> +
> +static void
> +gvir_connection_domain_restore_helper(GSimpleAsyncResult *res,
> +                                      GObject *object,
> +                                      GCancellable *cancellable G_GNUC_UNUSED)
> +{
> +    GVirConnection *conn = GVIR_CONNECTION(object);
> +    GVirDomainRestoreFromFileData *data;
> +    GError *err = NULL;
> +
> +    data = g_simple_async_result_get_op_res_gpointer(res);
> +
> +    if (!gvir_connection_domain_restore(conn, data->filename, data->custom_conf,
> +                                        data->flags, &err))
> +        g_simple_async_result_take_error(res, err);
> +}
> +
> +/**
> + * gvir_connection_domain_restore_async:
> + * @conn: a #GVirConnection
> + * @filename: path to input file
> + * @custom_conf: (allow-none): configuration for domain or NULL
> + * @flags: the flags
> + * @cancellable: (allow-none) (transfer none): cancallation object
> + * @callback: (scope async): completion callback
> + * @user_data: (closure): opaque data for callback
> + *
> + * Asynchronous variant of #gvir_connection_domain_restore
> + */
> +void gvir_connection_domain_restore_async(GVirConnection *conn,
> +                                          gchar *filename,
> +                                          GVirConfigDomain *custom_conf,
> +                                          guint flags,
> +                                          GCancellable *cancellable,
> +                                          GAsyncReadyCallback callback,
> +                                          gpointer user_data)
> +{
> +    GSimpleAsyncResult *res;
> +    GVirDomainRestoreFromFileData *data;
> +
> +    g_return_if_fail(GVIR_IS_CONNECTION(conn));
> +    g_return_if_fail((cancellable == NULL) || G_IS_CANCELLABLE(cancellable));
> +
> +    data = g_slice_new0(GVirDomainRestoreFromFileData);
> +    data->filename = g_strdup(filename);
> +    data->custom_conf = g_object_ref(custom_conf);
> +    data->flags = flags;
> +
> +    res = g_simple_async_result_new(G_OBJECT(conn),
> +                                    callback,
> +                                    user_data,
> +                                    gvir_connection_domain_restore_async);
> +    g_simple_async_result_set_op_res_gpointer
> +                          (res, data,
> +                           (GDestroyNotify)gvir_domain_save_to_file_data_free);
> +
> +    g_simple_async_result_run_in_thread(res,
> +                                        gvir_connection_domain_restore_helper,
> +                                        G_PRIORITY_DEFAULT,
> +                                        cancellable);
> +
> +    g_object_unref(res);
> +}
> +
> +/**
> + * gvir_connection_domain_finish:
> + * @conn: a #GVirConnection
> + * @result: (transfer none): async method result
> + * @err: Place-holder for possible errors
> + *
> + * Finishes the operation started by #gvir_domain_restore_async.
> + *
> + * Returns: TRUE if domain was restored successfully, FALSE otherwise.
> + */
> +gboolean gvir_connection_domain_restore_finish(GVirConnection *conn,
> +                                               GAsyncResult *result,
> +                                               GError **err)
> +{
> +    g_return_val_if_fail(GVIR_IS_CONNECTION(conn), FALSE);
> +    g_return_val_if_fail(g_simple_async_result_is_valid
> +                                  (result, G_OBJECT(conn),
> +                                   gvir_connection_domain_restore_async),
> +                                   FALSE);
> +
> +    if (g_simple_async_result_propagate_error(G_SIMPLE_ASYNC_RESULT(result),
> +                                              err))
> +        return FALSE;
> +
> +    return TRUE;
> +}
> diff --git a/libvirt-gobject/libvirt-gobject-connection.h b/libvirt-gobject/libvirt-gobject-connection.h
> index c80eecf..5932661 100644
> --- a/libvirt-gobject/libvirt-gobject-connection.h
> +++ b/libvirt-gobject/libvirt-gobject-connection.h
> @@ -38,6 +38,8 @@ G_BEGIN_DECLS
>
>  #define GVIR_TYPE_CONNECTION_HANDLE      (gvir_connection_handle_get_type ())
>
> +#define GVirDomainRestoreFromFileData GVirDomainSaveToFileData
> +
>  typedef struct _GVirNodeInfo GVirNodeInfo;
>  struct _GVirNodeInfo
>  {
> @@ -202,6 +204,24 @@ gvir_connection_get_capabilities_finish(GVirConnection *conn,
>                                          GAsyncResult *result,
>                                          GError **err);
>
> +gboolean gvir_connection_domain_restore(GVirConnection *conn,
> +                                        gchar *filename,
> +                                        GVirConfigDomain *custom_conf,
> +                                        guint flags,
> +                                        GError **err);
> +
> +void gvir_connection_domain_restore_async(GVirConnection *conn,
> +                                          gchar *filename,
> +                                          GVirConfigDomain *custom_conf,
> +                                          guint flags,
> +                                          GCancellable *cancellable,
> +                                          GAsyncReadyCallback callback,
> +                                          gpointer user_data);
> +
> +gboolean gvir_connection_domain_restore_finish(GVirConnection *conn,
> +                                               GAsyncResult *result,
> +                                               GError **err);
> +
>  G_END_DECLS
>
>  #endif /* __LIBVIRT_GOBJECT_CONNECTION_H__ */
> diff --git a/libvirt-gobject/libvirt-gobject-domain.c b/libvirt-gobject/libvirt-gobject-domain.c
> index 308a817..61c153b 100644
> --- a/libvirt-gobject/libvirt-gobject-domain.c
> +++ b/libvirt-gobject/libvirt-gobject-domain.c
> @@ -602,17 +602,11 @@ gboolean gvir_domain_save_to_file(GVirDomain *dom,
>      return TRUE;
>  }
>
> -typedef struct {
> -    gchar *filename;
> -    GVirConfigDomain *custom_conf;
> -    guint flags;
> -} DomainSaveToFileData;
> -
> -static void domain_save_to_file_data_free(DomainSaveToFileData *data)
> +void gvir_domain_save_to_file_data_free(GVirDomainSaveToFileData *data)
>  {
>      g_free(data->filename);
>      g_object_unref(data->custom_conf);
> -    g_slice_free(DomainSaveToFileData, data);
> +    g_slice_free(GVirDomainSaveToFileData, data);

What are all these changes for? You shouldn't be changing anything
related to virDomainSave here at all.

>  }
>
>  static void
> @@ -621,7 +615,7 @@ gvir_domain_save_to_file_helper(GSimpleAsyncResult *res,
>                                  GCancellable *cancellable G_GNUC_UNUSED)
>  {
>      GVirDomain *dom = GVIR_DOMAIN(object);
> -    DomainSaveToFileData *data;
> +    GVirDomainSaveToFileData *data;

Same here.

>      GError *err = NULL;
>
>      data = g_simple_async_result_get_op_res_gpointer(res);
> @@ -651,12 +645,12 @@ void gvir_domain_save_to_file_async(GVirDomain *dom,
>                                      gpointer user_data)
>  {
>      GSimpleAsyncResult *res;
> -    DomainSaveToFileData *data;
> +    GVirDomainSaveToFileData *data;

here too.

>      g_return_if_fail(GVIR_IS_DOMAIN(dom));
>      g_return_if_fail((cancellable == NULL) || G_IS_CANCELLABLE(cancellable));
>
> -    data = g_slice_new0(DomainSaveToFileData);
> +    data = g_slice_new0(GVirDomainSaveToFileData);

Ok, I stop pointing these now. I'm sure you can find the rest on your own.

>      data->filename = g_strdup(filename);
>      data->custom_conf = g_object_ref(custom_conf);
>      data->flags = flags;
> @@ -665,8 +659,10 @@ void gvir_domain_save_to_file_async(GVirDomain *dom,
>                                      callback,
>                                      user_data,
>                                      gvir_domain_save_to_file_async);
> -    g_simple_async_result_set_op_res_gpointer(res, data, (GDestroyNotify)
> -                                              domain_save_to_file_data_free);
> +    g_simple_async_result_set_op_res_gpointer
> +                                 (res, data,
> +                                  (GDestroyNotify)
> +                                  gvir_domain_save_to_file_data_free);
>
>      g_simple_async_result_run_in_thread(res,
>                                          gvir_domain_save_to_file_helper,
> diff --git a/libvirt-gobject/libvirt-gobject-domain.h b/libvirt-gobject/libvirt-gobject-domain.h
> index 8f17799..ac225a2 100644
> --- a/libvirt-gobject/libvirt-gobject-domain.h
> +++ b/libvirt-gobject/libvirt-gobject-domain.h
> @@ -112,6 +112,14 @@ struct _GVirDomainInfo
>      guint64 cpuTime;       /* the CPU time used in nanoseconds */
>  };
>
> +typedef struct _GVirDomainSaveToFileData GVirDomainSaveToFileData;
> +struct _GVirDomainSaveToFileData
> +{
> +    gchar *filename;
> +    GVirConfigDomain *custom_conf;
> +    guint flags;
> +};
> +
>  GType gvir_domain_get_type(void);
>  GType gvir_domain_info_get_type(void);
>  GType gvir_domain_handle_get_type(void);
> @@ -166,6 +174,8 @@ gboolean gvir_domain_save_to_file_finish(GVirDomain *dom,
>                                           GAsyncResult *result,
>                                           GError **err);
>
> +void gvir_domain_save_to_file_data_free(GVirDomainSaveToFileData *data);
> +
>  GVirDomainInfo *gvir_domain_get_info(GVirDomain *dom,
>                                       GError **err);
>  void gvir_domain_get_info_async(GVirDomain *dom,
> diff --git a/libvirt-gobject/libvirt-gobject.sym b/libvirt-gobject/libvirt-gobject.sym
> index 54a093a..dde0e70 100644
> --- a/libvirt-gobject/libvirt-gobject.sym
> +++ b/libvirt-gobject/libvirt-gobject.sym
> @@ -31,6 +31,9 @@ LIBVIRT_GOBJECT_0.0.8 {
>         gvir_connection_create_storage_pool;
>         gvir_connection_start_domain;
>         gvir_connection_get_node_info;
> +       gvir_connection_domain_restore;
> +       gvir_connection_domain_restore_async;
> +       gvir_connection_domain_restore_finish;
>
>         gvir_domain_device_get_type;
>         gvir_domain_device_get_domain;
> @@ -78,6 +81,7 @@ LIBVIRT_GOBJECT_0.0.8 {
>         gvir_domain_save_to_file;
>         gvir_domain_save_to_file_async;
>         gvir_domain_save_to_file_finish;
> +       gvir_domain_save_to_file_data_free;
>
>         gvir_domain_snapshot_get_type;
>         gvir_domain_snapshot_handle_get_type;
> --
> 1.7.10.4
>
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list



-- 
Regards,

Zeeshan Ali (Khattak)
FSF member#5124




More information about the libvir-list mailing list