[PATCH] Re: Proposal: Check availability of driver calls (repost)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Daniel Veillard wrote:
On Tue, Jul 31, 2007 at 02:09:20PM +0100, Richard W.M. Jones wrote:
Daniel Veillard wrote:
I'm not 100% sure we want to
expose this as a library API though, at least not in that way.
I should just say in case I wasn't 100% clear that this is just a driver API. Nothing should be exposed from libvirt.

  Then feature detection + versionning in the protocol. I'm

Here's a patch.

[I'm going to start a separate thread on the issue of exporting calls to libvirtd.]

Rich.

--
Emerging Technologies, Red Hat - http://et.redhat.com/~rjones/
Registered Address: Red Hat UK Ltd, Amberley Place, 107-111 Peascod
Street, Windsor, Berkshire, SL4 1TE, United Kingdom.  Registered in
England and Wales under Company Registration No. 03798903
Index: src/driver.h
===================================================================
RCS file: /data/cvs/libvirt/src/driver.h,v
retrieving revision 1.32
diff -u -p -r1.32 driver.h
--- src/driver.h	27 Jul 2007 23:23:00 -0000	1.32
+++ src/driver.h	31 Jul 2007 14:20:02 -0000
@@ -44,12 +44,44 @@ typedef enum {
     VIR_DRV_OPEN_ERROR = -2,
 } virDrvOpenStatus;
 
+/* Feature detection.  This is a libvirt-private interface for determining
+ * what features are supported by the driver.
+ *
+ * The remote driver passes features through to the real driver at the
+ * remote end unmodified, except if you query a VIR_DRV_FEATURE_REMOTE*
+ * feature.
+ */
+typedef enum {
+    /* Driver supports V1-style virDomainMigrate, ie. domainMigratePrepare/
+     * domainMigratePerform/domainMigrateFinish.
+     */
+    VIR_DRV_FEATURE_MIGRATION_V1 = 1,
+
+    /* Driver is not local. */
+    VIR_DRV_FEATURE_REMOTE = 2,
+} virDrvFeature;
+
+/* Internal feature-detection macro.  Don't call drv->supports_feature
+ * directly, because it may be NULL, use this macro instead.
+ *
+ * Note that you must check for errors.
+ *
+ * Returns:
+ *   >= 1  Feature is supported.
+ *   0     Feature is not supported.
+ *   -1    Error.
+ */
+#define VIR_DRV_SUPPORTS_FEATURE(drv,conn,feature)                      \
+    ((drv)->supports_feature ? (drv)->supports_feature((conn),(feature)) : 0)
+
 typedef virDrvOpenStatus
 	(*virDrvOpen)			(virConnectPtr conn,
 					 const char *name,
 					 int flags);
 typedef int
 	(*virDrvClose)			(virConnectPtr conn);
+typedef int
+    (*virDrvSupportsFeature) (virConnectPtr conn, virDrvFeature feature);
 typedef const char *
 	(*virDrvGetType)		(virConnectPtr conn);
 typedef int
@@ -202,6 +234,7 @@ struct _virDriver {
 	unsigned long ver;	/* the version of the backend */
 	virDrvOpen			open;
 	virDrvClose			close;
+    virDrvSupportsFeature   supports_feature;
 	virDrvGetType			type;
 	virDrvGetVersion		version;
     virDrvGetHostname       getHostname;
Index: src/internal.h
===================================================================
RCS file: /data/cvs/libvirt/src/internal.h,v
retrieving revision 1.47
diff -u -p -r1.47 internal.h
--- src/internal.h	25 Jul 2007 23:16:30 -0000	1.47
+++ src/internal.h	31 Jul 2007 14:20:03 -0000
@@ -229,6 +229,8 @@ int __virStateActive(void);
 #define virStateReload() __virStateReload()
 #define virStateActive() __virStateActive()
 
+int __virDrvSupportsFeature (virConnectPtr conn, int feature);
+
 #ifdef __cplusplus
 }
 #endif                          /* __cplusplus */
Index: src/libvirt.c
===================================================================
RCS file: /data/cvs/libvirt/src/libvirt.c,v
retrieving revision 1.92
diff -u -p -r1.92 libvirt.c
--- src/libvirt.c	27 Jul 2007 23:23:00 -0000	1.92
+++ src/libvirt.c	31 Jul 2007 14:20:04 -0000
@@ -540,6 +540,20 @@ virConnectClose(virConnectPtr conn)
     return (0);
 }
 
+/* Not for public use.  This function is part of the internal
+ * implementation of driver features in the remote case.
+ */
+int
+__virDrvSupportsFeature (virConnectPtr conn, int feature)
+{
+    DEBUG("conn=%p, feature=%d", conn, feature);
+
+    if (!VIR_IS_CONNECT(conn))
+        return (-1);
+
+    return VIR_DRV_SUPPORTS_FEATURE (conn->driver, conn, feature);
+}
+
 /**
  * virConnectGetType:
  * @conn: pointer to the hypervisor connection
Index: src/libvirt_sym.version
===================================================================
RCS file: /data/cvs/libvirt/src/libvirt_sym.version,v
retrieving revision 1.25
diff -u -p -r1.25 libvirt_sym.version
--- src/libvirt_sym.version	26 Jun 2007 22:56:14 -0000	1.25
+++ src/libvirt_sym.version	31 Jul 2007 14:20:05 -0000
@@ -116,5 +116,7 @@
  	__virStateReload;
  	__virStateActive;
 
+	__virDrvSupportsFeature;
+
     local: *;
 };
Index: src/qemu_driver.c
===================================================================
RCS file: /data/cvs/libvirt/src/qemu_driver.c,v
retrieving revision 1.14
diff -u -p -r1.14 qemu_driver.c
--- src/qemu_driver.c	30 Jul 2007 09:59:06 -0000	1.14
+++ src/qemu_driver.c	31 Jul 2007 14:20:07 -0000
@@ -2343,6 +2343,7 @@ static virDriver qemuDriver = {
     LIBVIR_VERSION_NUMBER,
     qemudOpen, /* open */
     qemudClose, /* close */
+    NULL, /* supports_feature */
     qemudGetType, /* type */
     qemudGetVersion, /* version */
     NULL, /* hostname */
Index: src/remote_internal.c
===================================================================
RCS file: /data/cvs/libvirt/src/remote_internal.c,v
retrieving revision 1.16
diff -u -p -r1.16 remote_internal.c
--- src/remote_internal.c	27 Jul 2007 23:23:00 -0000	1.16
+++ src/remote_internal.c	31 Jul 2007 14:20:10 -0000
@@ -1190,6 +1190,30 @@ remoteClose (virConnectPtr conn)
     return ret;
 }
 
+static int
+remoteSupportsFeature (virConnectPtr conn, virDrvFeature feature)
+{
+    remote_supports_feature_args args;
+    remote_supports_feature_ret ret;
+    GET_PRIVATE (conn, -1);
+
+    /* VIR_DRV_FEATURE_REMOTE* features are handled directly. */
+    switch (feature) {
+    case VIR_DRV_FEATURE_REMOTE: return 1;
+    default: /*FALLTHROUGH*/;
+    }
+
+    args.feature = feature;
+
+    memset (&ret, 0, sizeof ret);
+    if (call (conn, priv, 0, REMOTE_PROC_SUPPORTS_FEATURE,
+              (xdrproc_t) xdr_remote_supports_feature_args, (char *) &args,
+              (xdrproc_t) xdr_remote_supports_feature_ret, (char *) &ret) == -1)
+        return -1;
+
+    return ret.supported;
+}
+
 /* Unfortunately this function is defined to return a static string.
  * Since the remote end always answers with the same type (for a
  * single connection anyway) we cache the type in the connection's
@@ -2893,6 +2917,7 @@ static virDriver driver = {
     .ver = REMOTE_PROTOCOL_VERSION,
     .open = remoteOpen,
     .close = remoteClose,
+    .supports_feature = remoteSupportsFeature,
 	.type = remoteType,
 	.version = remoteVersion,
     .getHostname = remoteGetHostname,
Index: src/test.c
===================================================================
RCS file: /data/cvs/libvirt/src/test.c,v
retrieving revision 1.43
diff -u -p -r1.43 test.c
--- src/test.c	27 Jul 2007 23:23:00 -0000	1.43
+++ src/test.c	31 Jul 2007 14:20:12 -0000
@@ -1932,6 +1932,7 @@ static virDriver testDriver = {
     LIBVIR_VERSION_NUMBER,
     testOpen, /* open */
     testClose, /* close */
+    NULL, /* supports_feature */
     NULL, /* type */
     testGetVersion, /* version */
     testGetHostname, /* hostname */
Index: qemud/remote.c
===================================================================
RCS file: /data/cvs/libvirt/qemud/remote.c,v
retrieving revision 1.6
diff -u -p -r1.6 remote.c
--- qemud/remote.c	24 Jul 2007 14:21:03 -0000	1.6
+++ qemud/remote.c	31 Jul 2007 14:20:13 -0000
@@ -418,6 +418,18 @@ remoteDispatchClose (struct qemud_client
 }
 
 static int
+remoteDispatchSupportsFeature (struct qemud_client *client, remote_message_header *req,
+                               remote_supports_feature_args *args, remote_supports_feature_ret *ret)
+{
+    CHECK_CONN(client);
+
+    ret->supported = __virDrvSupportsFeature (client->conn, args->feature);
+    if (ret->supported == -1) return -1;
+
+    return 0;
+}
+
+static int
 remoteDispatchGetType (struct qemud_client *client, remote_message_header *req,
                        void *args ATTRIBUTE_UNUSED, remote_get_type_ret *ret)
 {
Index: qemud/remote_protocol.x
===================================================================
RCS file: /data/cvs/libvirt/qemud/remote_protocol.x,v
retrieving revision 1.3
diff -u -p -r1.3 remote_protocol.x
--- qemud/remote_protocol.x	26 Jun 2007 11:42:46 -0000	1.3
+++ qemud/remote_protocol.x	31 Jul 2007 14:20:13 -0000
@@ -170,6 +170,14 @@ struct remote_open_args {
     int flags;
 };
 
+struct remote_supports_feature_args {
+    int feature;
+};
+
+struct remote_supports_feature_ret {
+    int supported;
+};
+
 struct remote_get_type_ret {
     remote_nonnull_string type;
 };
@@ -610,7 +618,8 @@ enum remote_procedure {
     REMOTE_PROC_DOMAIN_GET_SCHEDULER_TYPE = 56,
     REMOTE_PROC_DOMAIN_GET_SCHEDULER_PARAMETERS = 57,
     REMOTE_PROC_DOMAIN_SET_SCHEDULER_PARAMETERS = 58,
-    REMOTE_PROC_GET_HOSTNAME = 59
+    REMOTE_PROC_GET_HOSTNAME = 59,
+    REMOTE_PROC_SUPPORTS_FEATURE = 60
 };
 
 /* Custom RPC structure. */

Attachment: smime.p7s
Description: S/MIME Cryptographic Signature

--
Libvir-list mailing list
Libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list

[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]