]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
Introduce virConnectGetDomainCapabilities
authorMichal Privoznik <mprivozn@redhat.com>
Wed, 25 Jun 2014 15:05:20 +0000 (17:05 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Thu, 3 Jul 2014 10:22:37 +0000 (12:22 +0200)
The API should expose the information contained in virDomainCapsPtr.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
include/libvirt/libvirt.h.in
src/driver.h
src/libvirt.c
src/libvirt_public.syms
src/remote/remote_driver.c
src/remote/remote_protocol.x
src/remote_protocol-structs

index 032d6e63096b3f636af78be455ec3ed349423552..aedd49ad57fa9fba4c963b3c2dbe7dfba73c5475 100644 (file)
@@ -1585,6 +1585,13 @@ int                     virNodeGetInfo          (virConnectPtr conn,
                                                  virNodeInfoPtr info);
 char *                  virConnectGetCapabilities (virConnectPtr conn);
 
+char * virConnectGetDomainCapabilities(virConnectPtr conn,
+                                       const char *emulatorbin,
+                                       const char *arch,
+                                       const char *machine,
+                                       const char *virttype,
+                                       unsigned int flags);
+
 int                     virNodeGetCPUStats (virConnectPtr conn,
                                             int cpuNum,
                                             virNodeCPUStatsPtr params,
index 5018068f3320f1f30db75879eb75dd3e54a14d29..c769675b0496d455af227a67706b63c38b140d00 100644 (file)
@@ -126,6 +126,14 @@ typedef int
 typedef char *
 (*virDrvConnectGetCapabilities)(virConnectPtr conn);
 
+typedef char *
+(*virDrvConnectGetDomainCapabilities)(virConnectPtr conn,
+                                      const char *emulatorbin,
+                                      const char *arch,
+                                      const char *machine,
+                                      const char *virttype,
+                                      unsigned int flags);
+
 typedef int
 (*virDrvConnectListDomains)(virConnectPtr conn,
                             int *ids,
@@ -1407,6 +1415,7 @@ struct _virDriver {
     virDrvDomainGetTime domainGetTime;
     virDrvDomainSetTime domainSetTime;
     virDrvNodeGetFreePages nodeGetFreePages;
+    virDrvConnectGetDomainCapabilities connectGetDomainCapabilities;
 };
 
 
index 88c1f49fadf0bcbce40c5daf19b82cede5f8b70b..b80b484cf161a0d218b30b1f32ca8a13603126c9 100644 (file)
@@ -21137,3 +21137,56 @@ virNetworkDHCPLeaseFree(virNetworkDHCPLeasePtr lease)
     VIR_FREE(lease->clientid);
     VIR_FREE(lease);
 }
+
+/**
+ * virConnectGetDomainCapabilities:
+ * @conn: pointer to the hypervisor connection
+ * @emulatorbin: path to emulator
+ * @arch: domain architecture
+ * @machine: machine type
+ * @virttype: virtualization type
+ * @flags: extra flags; not used yet, so callers should always pass 0
+ *
+ * Prior creating a domain (for instance via virDomainCreateXML
+ * or virDomainDefineXML) it may be suitable to know what the
+ * underlying emulator and/or libvirt is capable of. For
+ * instance, if host, libvirt and qemu is capable of VFIO
+ * passthrough and so on.
+ *
+ * Returns NULL in case of error or an XML string
+ * defining the capabilities.
+ */
+char *
+virConnectGetDomainCapabilities(virConnectPtr conn,
+                                const char *emulatorbin,
+                                const char *arch,
+                                const char *machine,
+                                const char *virttype,
+                                unsigned int flags)
+{
+    VIR_DEBUG("conn=%p, emulatorbin=%s, arch=%s, "
+              "machine=%s, virttype=%s, flags=%x",
+              conn, NULLSTR(emulatorbin), NULLSTR(arch),
+              NULLSTR(machine), NULLSTR(virttype), flags);
+
+    virResetLastError();
+
+    virCheckConnectReturn(conn, NULL);
+
+    if (conn->driver->connectGetDomainCapabilities) {
+        char *ret;
+        ret = conn->driver->connectGetDomainCapabilities(conn, emulatorbin,
+                                                         arch, machine,
+                                                         virttype, flags);
+        if (!ret)
+            goto error;
+        VIR_DEBUG("conn=%p, ret=%s", conn, ret);
+        return ret;
+    }
+
+    virReportUnsupportedError();
+
+ error:
+    virDispatchError(conn);
+    return NULL;
+}
index 65a5b43acc30dea01e16dcdf0d90b75adbf70882..9f4016a85fa88d7c08df6b6a9a74cc66f245bc5e 100644 (file)
@@ -665,4 +665,9 @@ LIBVIRT_1.2.6 {
         virNetworkGetDHCPLeases;
 } LIBVIRT_1.2.5;
 
+LIBVIRT_1.2.7 {
+    global:
+        virConnectGetDomainCapabilities;
+} LIBVIRT_1.2.6;
+
 # .... define new API here using predicted next version number ....
index 3c10d5ce63f7b283e2ea40ae9071c13905b6f89b..88fc9777d270e247f3382d7c62aeacc0df919203 100644 (file)
@@ -8004,6 +8004,7 @@ static virDriver remote_driver = {
     .domainGetTime = remoteDomainGetTime, /* 1.2.5 */
     .domainSetTime = remoteDomainSetTime, /* 1.2.5 */
     .nodeGetFreePages = remoteNodeGetFreePages, /* 1.2.6 */
+    .connectGetDomainCapabilities = remoteConnectGetDomainCapabilities, /* 1.2.7 */
 };
 
 static virNetworkDriver network_driver = {
index bff2c4720942adedb43a3929e625654b2e6a94d3..5c316fb5769c1279743aba9323876b8e16e506b8 100644 (file)
@@ -478,6 +478,18 @@ struct remote_connect_get_capabilities_ret {
     remote_nonnull_string capabilities;
 };
 
+struct remote_connect_get_domain_capabilities_args {
+    remote_string emulatorbin;
+    remote_string arch;
+    remote_string machine;
+    remote_string virttype;
+    unsigned int flags;
+};
+
+struct remote_connect_get_domain_capabilities_ret {
+    remote_nonnull_string capabilities;
+};
+
 struct remote_node_get_cpu_stats_args {
     int cpuNum;
     int nparams;
@@ -5402,6 +5414,11 @@ enum remote_procedure {
      * @generate: none
      * @acl: network:read
      */
-    REMOTE_PROC_NETWORK_GET_DHCP_LEASES = 341
+    REMOTE_PROC_NETWORK_GET_DHCP_LEASES = 341,
 
+    /**
+     * @generate: both
+     * @acl: connect:write
+     */
+    REMOTE_PROC_CONNECT_GET_DOMAIN_CAPABILITIES = 342
 };
index a14e1fd6700af00ce471d0347db143254d1cb156..9bf09b84179b6243ffc7db4c598ff823e38283f3 100644 (file)
@@ -148,6 +148,16 @@ struct remote_node_get_info_ret {
 struct remote_connect_get_capabilities_ret {
         remote_nonnull_string      capabilities;
 };
+struct remote_connect_get_domain_capabilities_args {
+        remote_string              emulatorbin;
+        remote_string              arch;
+        remote_string              machine;
+        remote_string              virttype;
+        u_int                      flags;
+};
+struct remote_connect_get_domain_capabilities_ret {
+        remote_nonnull_string      capabilities;
+};
 struct remote_node_get_cpu_stats_args {
         int                        cpuNum;
         int                        nparams;
@@ -2851,4 +2861,5 @@ enum remote_procedure {
         REMOTE_PROC_DOMAIN_EVENT_BLOCK_JOB_2 = 339,
         REMOTE_PROC_NODE_GET_FREE_PAGES = 340,
         REMOTE_PROC_NETWORK_GET_DHCP_LEASES = 341,
+        REMOTE_PROC_CONNECT_GET_DOMAIN_CAPABILITIES = 342,
 };