On 06/30/2014 11:31 AM, Michal Privoznik wrote:
The API should expose the information contained in virDomainCapsPtr.
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
include/libvirt/libvirt.h.in | 7 ++++++
src/driver.h | 9 ++++++++
src/libvirt.c | 52 ++++++++++++++++++++++++++++++++++++++++++++
src/libvirt_public.syms | 5 +++++
src/remote/remote_driver.c | 1 +
src/remote/remote_protocol.x | 19 +++++++++++++++-
src/remote_protocol-structs | 11 ++++++++++
7 files changed, 103 insertions(+), 1 deletion(-)
diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in
index 032d6e6..aedd49a 100644
--- a/include/libvirt/libvirt.h.in
+++ b/include/libvirt/libvirt.h.in
@@ -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,
diff --git a/src/driver.h b/src/driver.h
index 5018068..c769675 100644
--- a/src/driver.h
+++ b/src/driver.h
@@ -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;
};
diff --git a/src/libvirt.c b/src/libvirt.c
index 88c1f49..3511b1b 100644
--- a/src/libvirt.c
+++ b/src/libvirt.c
@@ -21137,3 +21137,55 @@ 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
s/error,/error/
FWIW: Use of the comma in this construct "looks odd" as if there was
some third option. Think of it this way "a or b" or "a, b, or c"
where
the comma is added in the second construct to separate list elements.
Seems the rest is right to me - although I guess the answer to whether
NULL is "expected" or not is something that needs to be answered before
there's an ACK.
John
+ * 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, emulatorbin, arch, machine, virttype, flags);
+
There's nothing that's stopping someone from passing NULL for
emulatorbin, arch, machine, & virttype...
+ 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;
+}
diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms
index 65a5b43..9f4016a 100644
--- a/src/libvirt_public.syms
+++ b/src/libvirt_public.syms
@@ -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 ....
diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
index 3c10d5c..88fc977 100644
--- a/src/remote/remote_driver.c
+++ b/src/remote/remote_driver.c
@@ -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 = {
diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x
index bff2c47..5c316fb 100644
--- a/src/remote/remote_protocol.x
+++ b/src/remote/remote_protocol.x
@@ -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
};
diff --git a/src/remote_protocol-structs b/src/remote_protocol-structs
index a14e1fd..9bf09b8 100644
--- a/src/remote_protocol-structs
+++ b/src/remote_protocol-structs
@@ -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,
};