Re: [libvirt] [libvirt-dbus] [PATCH 1/2] Introduce Domain Snapshot Interface

2019-10-22 Thread Pavel Hrdina
On Thu, Oct 10, 2019 at 01:43:09PM +0200, Simon Kobyda wrote:
> Signed-off-by: Simon Kobyda 
> ---
>  data/org.libvirt.DomainSnapshot.xml |  7 +++
>  src/connect.c   |  6 +++
>  src/connect.h   |  1 +
>  src/domainsnapshot.c| 79 +
>  src/domainsnapshot.h|  9 
>  src/meson.build |  1 +
>  src/util.c  | 49 ++
>  src/util.h  | 16 ++
>  8 files changed, 168 insertions(+)
>  create mode 100644 data/org.libvirt.DomainSnapshot.xml
>  create mode 100644 src/domainsnapshot.c
>  create mode 100644 src/domainsnapshot.h
> 
> diff --git a/data/org.libvirt.DomainSnapshot.xml 
> b/data/org.libvirt.DomainSnapshot.xml
> new file mode 100644
> index 000..80f61c6
> --- /dev/null
> +++ b/data/org.libvirt.DomainSnapshot.xml
> @@ -0,0 +1,7 @@
> + 1.0//EN"
> +"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd;>
> +
> +

I would rather name it as domainsnapshot.  It's unlikely that we will
ever have some other type of snapshot in libvirt but it will at least
follow the same naming as in libvirt APIs.

> +  
> +  
> +
> diff --git a/src/connect.c b/src/connect.c
> index f8f76a2..b40b0ba 100644
> --- a/src/connect.c
> +++ b/src/connect.c
> @@ -1,5 +1,6 @@
>  #include "connect.h"
>  #include "domain.h"
> +#include "domainsnapshot.h"
>  #include "events.h"
>  #include "interface.h"
>  #include "network.h"
> @@ -2002,6 +2003,7 @@ virtDBusConnectFree(virtDBusConnect *connect)
>  virtDBusConnectClose(connect, TRUE);
>  
>  g_free(connect->domainPath);
> +g_free(connect->domainSnapshotPath);
>  g_free(connect->interfacePath);
>  g_free(connect->networkPath);
>  g_free(connect->nodeDevPath);
> @@ -2062,6 +2064,10 @@ virtDBusConnectNew(virtDBusConnect **connectp,
>  if (error && *error)
>  return;
>  
> +virtDBusDomainSnapshotRegister(connect, error);
> +if (error && *error)
> +return;
> +
>  virtDBusInterfaceRegister(connect, error);
>  if (error && *error)
>  return;
> diff --git a/src/connect.h b/src/connect.h
> index 829bd57..74c89cf 100644
> --- a/src/connect.h
> +++ b/src/connect.h
> @@ -13,6 +13,7 @@ struct virtDBusConnect {
>  const gchar *uri;
>  const gchar *connectPath;
>  gchar *domainPath;
> +gchar *domainSnapshotPath;
>  gchar *interfacePath;
>  gchar *networkPath;
>  gchar *nodeDevPath;
> diff --git a/src/domainsnapshot.c b/src/domainsnapshot.c
> new file mode 100644
> index 000..590cbef
> --- /dev/null
> +++ b/src/domainsnapshot.c
> @@ -0,0 +1,79 @@
> +#include "domainsnapshot.h"
> +#include "util.h"
> +
> +#include 
> +
> +static virtDBusGDBusPropertyTable virtDBusDomainSnapshotPropertyTable[] = {
> +{ 0 }
> +};
> +
> +static virtDBusGDBusMethodTable virtDBusDomainSnapshotMethodTable[] = {
> +{ 0 }
> +};
> +
> +static gchar **
> +virtDBusDomainSnapshotEnumerate(gpointer userData)
> +{
> +virtDBusConnect *connect = userData;
> +g_autoptr(virDomainPtr) domains = NULL;
> +gint numDoms = 0;
> +GPtrArray *list = NULL;

There is no need to use GPtrArray.

> +
> +if (!virtDBusConnectOpen(connect, NULL))
> +return NULL;
> +
> +numDoms = virConnectListAllDomains(connect->connection, , 0);
> +if (numDoms <= 0)
> +return NULL;

Here you can allocate the return array if strings directly ...

> +
> +list = g_ptr_array_new();
> +
> +for (gint i = 0; i < numDoms; i++) {
> +g_autoptr(virDomainSnapshotPtr) domainSnapshots = NULL;
> +gint numSnaps;
> +
> +numSnaps = virDomainListAllSnapshots(domains[i], , 
> 0);
> +if (numSnaps <= 0)
> +continue;
> +
> +for (gint j = 0; j < numSnaps; j++) {
> +gchar *snapPath = 
> virtDBusUtilBusPathForVirDomainSnapshot(domains[i],
> +  
> domainSnapshots[j],
> +  
> connect->domainSnapshotPath);
> +g_ptr_array_add(list, snapPath);

... and here you can just add the path to the array.

In addition the list that you are using is not used after this point.

> +}
> +}
> +
> +gchar **ret = g_new0(gchar *, numDoms + 1);
> +
> +for (gint i = 0; i < numDoms; i++) {
> +ret[i] = virtDBusUtilBusPathForVirDomain(domains[i],
> + connect->domainPath);
> +}

Here you call new for loop that will fill the ret value with domain
paths instead of domainSnapshot paths.

> +
> +return ret;
> +}
> +
> +static GDBusInterfaceInfo *interfaceInfo = NULL;
> +
> +void
> +virtDBusDomainSnapshotRegister(virtDBusConnect *connect,
> +   GError **error)
> +{
> +connect->domainSnapshotPath = g_strdup_printf("%s/snapshot", 
> connect->connectPath);
> +
> 

[libvirt] [libvirt-dbus] [PATCH 1/2] Introduce Domain Snapshot Interface

2019-10-10 Thread Simon Kobyda
Signed-off-by: Simon Kobyda 
---
 data/org.libvirt.DomainSnapshot.xml |  7 +++
 src/connect.c   |  6 +++
 src/connect.h   |  1 +
 src/domainsnapshot.c| 79 +
 src/domainsnapshot.h|  9 
 src/meson.build |  1 +
 src/util.c  | 49 ++
 src/util.h  | 16 ++
 8 files changed, 168 insertions(+)
 create mode 100644 data/org.libvirt.DomainSnapshot.xml
 create mode 100644 src/domainsnapshot.c
 create mode 100644 src/domainsnapshot.h

diff --git a/data/org.libvirt.DomainSnapshot.xml 
b/data/org.libvirt.DomainSnapshot.xml
new file mode 100644
index 000..80f61c6
--- /dev/null
+++ b/data/org.libvirt.DomainSnapshot.xml
@@ -0,0 +1,7 @@
+http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd;>
+
+
+  
+  
+
diff --git a/src/connect.c b/src/connect.c
index f8f76a2..b40b0ba 100644
--- a/src/connect.c
+++ b/src/connect.c
@@ -1,5 +1,6 @@
 #include "connect.h"
 #include "domain.h"
+#include "domainsnapshot.h"
 #include "events.h"
 #include "interface.h"
 #include "network.h"
@@ -2002,6 +2003,7 @@ virtDBusConnectFree(virtDBusConnect *connect)
 virtDBusConnectClose(connect, TRUE);
 
 g_free(connect->domainPath);
+g_free(connect->domainSnapshotPath);
 g_free(connect->interfacePath);
 g_free(connect->networkPath);
 g_free(connect->nodeDevPath);
@@ -2062,6 +2064,10 @@ virtDBusConnectNew(virtDBusConnect **connectp,
 if (error && *error)
 return;
 
+virtDBusDomainSnapshotRegister(connect, error);
+if (error && *error)
+return;
+
 virtDBusInterfaceRegister(connect, error);
 if (error && *error)
 return;
diff --git a/src/connect.h b/src/connect.h
index 829bd57..74c89cf 100644
--- a/src/connect.h
+++ b/src/connect.h
@@ -13,6 +13,7 @@ struct virtDBusConnect {
 const gchar *uri;
 const gchar *connectPath;
 gchar *domainPath;
+gchar *domainSnapshotPath;
 gchar *interfacePath;
 gchar *networkPath;
 gchar *nodeDevPath;
diff --git a/src/domainsnapshot.c b/src/domainsnapshot.c
new file mode 100644
index 000..590cbef
--- /dev/null
+++ b/src/domainsnapshot.c
@@ -0,0 +1,79 @@
+#include "domainsnapshot.h"
+#include "util.h"
+
+#include 
+
+static virtDBusGDBusPropertyTable virtDBusDomainSnapshotPropertyTable[] = {
+{ 0 }
+};
+
+static virtDBusGDBusMethodTable virtDBusDomainSnapshotMethodTable[] = {
+{ 0 }
+};
+
+static gchar **
+virtDBusDomainSnapshotEnumerate(gpointer userData)
+{
+virtDBusConnect *connect = userData;
+g_autoptr(virDomainPtr) domains = NULL;
+gint numDoms = 0;
+GPtrArray *list = NULL;
+
+if (!virtDBusConnectOpen(connect, NULL))
+return NULL;
+
+numDoms = virConnectListAllDomains(connect->connection, , 0);
+if (numDoms <= 0)
+return NULL;
+
+list = g_ptr_array_new();
+
+for (gint i = 0; i < numDoms; i++) {
+g_autoptr(virDomainSnapshotPtr) domainSnapshots = NULL;
+gint numSnaps;
+
+numSnaps = virDomainListAllSnapshots(domains[i], , 0);
+if (numSnaps <= 0)
+continue;
+
+for (gint j = 0; j < numSnaps; j++) {
+gchar *snapPath = 
virtDBusUtilBusPathForVirDomainSnapshot(domains[i],
+  
domainSnapshots[j],
+  
connect->domainSnapshotPath);
+g_ptr_array_add(list, snapPath);
+}
+}
+
+gchar **ret = g_new0(gchar *, numDoms + 1);
+
+for (gint i = 0; i < numDoms; i++) {
+ret[i] = virtDBusUtilBusPathForVirDomain(domains[i],
+ connect->domainPath);
+}
+
+return ret;
+}
+
+static GDBusInterfaceInfo *interfaceInfo = NULL;
+
+void
+virtDBusDomainSnapshotRegister(virtDBusConnect *connect,
+   GError **error)
+{
+connect->domainSnapshotPath = g_strdup_printf("%s/snapshot", 
connect->connectPath);
+
+if (!interfaceInfo) {
+interfaceInfo = 
virtDBusGDBusLoadIntrospectData(VIRT_DBUS_DOMAIN_SNAPSHOT_INTERFACE,
+error);
+if (!interfaceInfo)
+return;
+}
+
+virtDBusGDBusRegisterSubtree(connect->bus,
+ connect->domainSnapshotPath,
+ interfaceInfo,
+ virtDBusDomainSnapshotEnumerate,
+ virtDBusDomainSnapshotMethodTable,
+ virtDBusDomainSnapshotPropertyTable,
+ connect);
+}
diff --git a/src/domainsnapshot.h b/src/domainsnapshot.h
new file mode 100644
index 000..7d8a938
--- /dev/null
+++ b/src/domainsnapshot.h
@@ -0,0 +1,9 @@
+#pragma once
+
+#include "connect.h"
+
+#define 

Re: [libvirt] [libvirt-dbus] [PATCH 1/2] Introduce Domain Snapshot Interface

2019-10-08 Thread Ján Tomko

On Mon, Oct 07, 2019 at 05:22:33PM +0200, Simon Kobyda wrote:

Signed-off-by: Simon Kobyda 
---
data/Makefile.am|  1 +
data/org.libvirt.DomainSnapshot.xml |  7 +++
src/Makefile.am |  2 +
src/connect.c   |  6 +++
src/connect.h   |  1 +
src/domainsnapshot.c| 79 +
src/domainsnapshot.h|  9 
src/util.c  | 47 +
src/util.h  | 16 ++
9 files changed, 168 insertions(+)
create mode 100644 data/org.libvirt.DomainSnapshot.xml
create mode 100644 src/domainsnapshot.c
create mode 100644 src/domainsnapshot.h

diff --git a/src/util.c b/src/util.c
index 103bb29..2be616c 100644
--- a/src/util.c
+++ b/src/util.c
@@ -279,6 +279,53 @@ virtDBusUtilVirDomainListFree(virDomainPtr *domains)
g_free(domains);
}

+virDomainSnapshotPtr
+virtDBusUtilVirDomainSnapshotFromBusPath(virConnectPtr connection,
+ const gchar *path,
+ const gchar *domainSnapshotPath)
+{
+g_autofree gchar *domainName = NULL;
+g_autofree gchar *snapshotName = NULL;
+g_autoptr(virDomain) domain = NULL;
+gsize prefixLen = strlen(domainSnapshotPath) + 1;
+gchar** strings = g_strsplit(path + prefixLen, "_", 2);
+


This won't work correctly with domain names containing "_" - you will
split in the domain name instead.

Using UUIDs instead of names should give you a fixed point where to
split.


+domainName = virtDBusUtilDecodeStr(strings[0]);
+snapshotName = virtDBusUtilDecodeStr(strings[1]);
+
+domain = virDomainLookupByName(connection, domainName);
+
+return virDomainSnapshotLookupByName(domain, snapshotName, 0); // TODO 
flags for external?
+}
+


Jano


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

[libvirt] [libvirt-dbus] [PATCH 1/2] Introduce Domain Snapshot Interface

2019-10-07 Thread Simon Kobyda
Signed-off-by: Simon Kobyda 
---
 data/Makefile.am|  1 +
 data/org.libvirt.DomainSnapshot.xml |  7 +++
 src/Makefile.am |  2 +
 src/connect.c   |  6 +++
 src/connect.h   |  1 +
 src/domainsnapshot.c| 79 +
 src/domainsnapshot.h|  9 
 src/util.c  | 47 +
 src/util.h  | 16 ++
 9 files changed, 168 insertions(+)
 create mode 100644 data/org.libvirt.DomainSnapshot.xml
 create mode 100644 src/domainsnapshot.c
 create mode 100644 src/domainsnapshot.h

diff --git a/data/Makefile.am b/data/Makefile.am
index f8311bd..5617c78 100644
--- a/data/Makefile.am
+++ b/data/Makefile.am
@@ -33,6 +33,7 @@ polkit_DATA = \
 interfaces_files = \
org.libvirt.Connect.xml \
org.libvirt.Domain.xml \
+   org.libvirt.DomainSnapshot.xml \
org.libvirt.Interface.xml \
org.libvirt.Network.xml \
org.libvirt.NodeDevice.xml \
diff --git a/data/org.libvirt.DomainSnapshot.xml 
b/data/org.libvirt.DomainSnapshot.xml
new file mode 100644
index 000..80f61c6
--- /dev/null
+++ b/data/org.libvirt.DomainSnapshot.xml
@@ -0,0 +1,7 @@
+http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd;>
+
+
+  
+  
+
diff --git a/src/Makefile.am b/src/Makefile.am
index 845696e..a78bac8 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -37,6 +37,8 @@ libvirt_dbus_SOURCES = \
connect.h \
domain.c \
domain.h \
+   domainsnapshot.c \
+   domainsnapshot.h \
events.c \
events.h \
gdbus.c \
diff --git a/src/connect.c b/src/connect.c
index f8f76a2..b40b0ba 100644
--- a/src/connect.c
+++ b/src/connect.c
@@ -1,5 +1,6 @@
 #include "connect.h"
 #include "domain.h"
+#include "domainsnapshot.h"
 #include "events.h"
 #include "interface.h"
 #include "network.h"
@@ -2002,6 +2003,7 @@ virtDBusConnectFree(virtDBusConnect *connect)
 virtDBusConnectClose(connect, TRUE);
 
 g_free(connect->domainPath);
+g_free(connect->domainSnapshotPath);
 g_free(connect->interfacePath);
 g_free(connect->networkPath);
 g_free(connect->nodeDevPath);
@@ -2062,6 +2064,10 @@ virtDBusConnectNew(virtDBusConnect **connectp,
 if (error && *error)
 return;
 
+virtDBusDomainSnapshotRegister(connect, error);
+if (error && *error)
+return;
+
 virtDBusInterfaceRegister(connect, error);
 if (error && *error)
 return;
diff --git a/src/connect.h b/src/connect.h
index 829bd57..74c89cf 100644
--- a/src/connect.h
+++ b/src/connect.h
@@ -13,6 +13,7 @@ struct virtDBusConnect {
 const gchar *uri;
 const gchar *connectPath;
 gchar *domainPath;
+gchar *domainSnapshotPath;
 gchar *interfacePath;
 gchar *networkPath;
 gchar *nodeDevPath;
diff --git a/src/domainsnapshot.c b/src/domainsnapshot.c
new file mode 100644
index 000..590cbef
--- /dev/null
+++ b/src/domainsnapshot.c
@@ -0,0 +1,79 @@
+#include "domainsnapshot.h"
+#include "util.h"
+
+#include 
+
+static virtDBusGDBusPropertyTable virtDBusDomainSnapshotPropertyTable[] = {
+{ 0 }
+};
+
+static virtDBusGDBusMethodTable virtDBusDomainSnapshotMethodTable[] = {
+{ 0 }
+};
+
+static gchar **
+virtDBusDomainSnapshotEnumerate(gpointer userData)
+{
+virtDBusConnect *connect = userData;
+g_autoptr(virDomainPtr) domains = NULL;
+gint numDoms = 0;
+GPtrArray *list = NULL;
+
+if (!virtDBusConnectOpen(connect, NULL))
+return NULL;
+
+numDoms = virConnectListAllDomains(connect->connection, , 0);
+if (numDoms <= 0)
+return NULL;
+
+list = g_ptr_array_new();
+
+for (gint i = 0; i < numDoms; i++) {
+g_autoptr(virDomainSnapshotPtr) domainSnapshots = NULL;
+gint numSnaps;
+
+numSnaps = virDomainListAllSnapshots(domains[i], , 0);
+if (numSnaps <= 0)
+continue;
+
+for (gint j = 0; j < numSnaps; j++) {
+gchar *snapPath = 
virtDBusUtilBusPathForVirDomainSnapshot(domains[i],
+  
domainSnapshots[j],
+  
connect->domainSnapshotPath);
+g_ptr_array_add(list, snapPath);
+}
+}
+
+gchar **ret = g_new0(gchar *, numDoms + 1);
+
+for (gint i = 0; i < numDoms; i++) {
+ret[i] = virtDBusUtilBusPathForVirDomain(domains[i],
+ connect->domainPath);
+}
+
+return ret;
+}
+
+static GDBusInterfaceInfo *interfaceInfo = NULL;
+
+void
+virtDBusDomainSnapshotRegister(virtDBusConnect *connect,
+   GError **error)
+{
+connect->domainSnapshotPath = g_strdup_printf("%s/snapshot", 
connect->connectPath);
+
+if (!interfaceInfo) {
+interfaceInfo =