This patch adds virConnectGetDomainCapabilities support for bhyve.
---
src/bhyve/bhyve_capabilities.c | 26 ++++++++++++++++++++
src/bhyve/bhyve_capabilities.h | 5 ++++
src/bhyve/bhyve_driver.c | 56 ++++++++++++++++++++++++++++++++++++++++++
3 files changed, 87 insertions(+)
diff --git a/src/bhyve/bhyve_capabilities.c b/src/bhyve/bhyve_capabilities.c
index d0af4d9..10c33b9 100644
--- a/src/bhyve/bhyve_capabilities.c
+++ b/src/bhyve/bhyve_capabilities.c
@@ -3,6 +3,7 @@
*
* Copyright (C) 2014 Roman Bogorodskiy
* Copyright (C) 2014 Semihalf
+ * Copyright (C) 2016 Fabian Freyer
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -106,6 +107,31 @@ virBhyveCapsBuild(void)
return NULL;
}
+virDomainCapsPtr
+virBhyveDomainCapsBuild(const char *emulatorbin,
+ const char *machine,
+ virArch arch,
+ virDomainVirtType virttype)
+{
+ virDomainCapsPtr caps = NULL;
+
+ if (!(caps = virDomainCapsNew(emulatorbin, machine, arch, virttype)))
+ goto cleanup;
+
+ caps->os.supported = true;
+ caps->disk.supported = true;
+ VIR_DOMAIN_CAPS_ENUM_SET(caps->disk.diskDevice,
+ VIR_DOMAIN_DISK_DEVICE_DISK,
+ VIR_DOMAIN_DISK_DEVICE_CDROM);
+
+ VIR_DOMAIN_CAPS_ENUM_SET(caps->disk.bus,
+ VIR_DOMAIN_DISK_BUS_SATA,
+ VIR_DOMAIN_DISK_BUS_VIRTIO);
+
+ cleanup:
+ return caps;
+}
+
int
virBhyveProbeGrubCaps(virBhyveGrubCapsFlags *caps)
{
diff --git a/src/bhyve/bhyve_capabilities.h b/src/bhyve/bhyve_capabilities.h
index 0eb22a4..85018cb 100644
--- a/src/bhyve/bhyve_capabilities.h
+++ b/src/bhyve/bhyve_capabilities.h
@@ -23,8 +23,13 @@
# define _BHYVE_CAPABILITIES
# include "capabilities.h"
+#include "conf/domain_capabilities.h"
virCapsPtr virBhyveCapsBuild(void);
+virDomainCapsPtr virBhyveDomainCapsBuild(const char *emulatorbin,
+ const char *machine,
+ virArch arch,
+ virDomainVirtType virttype);
/* These are bit flags: */
typedef enum {
diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c
index 8036661..ae37a2d 100644
--- a/src/bhyve/bhyve_driver.c
+++ b/src/bhyve/bhyve_driver.c
@@ -53,6 +53,7 @@
#include "nodeinfo.h"
#include "virhostcpu.h"
#include "virhostmem.h"
+#include "conf/domain_capabilities.h"
#include "bhyve_device.h"
#include "bhyve_driver.h"
@@ -1539,6 +1540,60 @@ bhyveConnectIsEncrypted(virConnectPtr conn ATTRIBUTE_UNUSED)
return 0;
}
+static char *
+bhyveConnectGetDomainCapabilities(virConnectPtr conn,
+ const char *emulatorbin,
+ const char *arch_str,
+ const char *machine,
+ const char *virttype_str,
+ unsigned int flags)
+{
+ //bhyveConnPtr privconn = conn->privateData;
+ virDomainCapsPtr caps = NULL;
+ char *ret = NULL;
+ int virttype = VIR_DOMAIN_VIRT_BHYVE;
+ int arch = virArchFromHost(); /* virArch */
+
+ virCheckFlags(0, ret);
+
+ if (virConnectGetDomainCapabilitiesEnsureACL(conn) < 0)
+ return ret;
+
+ if (virttype_str &&
+ (virttype = virDomainVirtTypeFromString(virttype_str)) < 0) {
+ virReportError(VIR_ERR_INVALID_ARG,
+ _("unknown virttype: %s"),
+ virttype_str);
+ goto cleanup;
+ }
+
+ if (virttype != VIR_DOMAIN_VIRT_BHYVE) {
+ virReportError(VIR_ERR_INVALID_ARG,
+ _("unknown virttype: %s"),
+ virttype_str);
+ goto cleanup;
+ }
+
+ if (arch_str && (arch = virArchFromString(arch_str)) == VIR_ARCH_NONE) {
+ virReportError(VIR_ERR_INVALID_ARG,
+ _("unknown architecture: %s"),
+ arch_str);
+ goto cleanup;
+ }
+
+ if (emulatorbin == NULL)
+ emulatorbin = "/usr/sbin/bhyve";
+
+ if (!(caps = virBhyveDomainCapsBuild(emulatorbin, machine, arch, virttype)))
+ goto cleanup;
+
+ ret = virDomainCapsFormat(caps);
+
+ cleanup:
+ virObjectUnref(caps);
+ return ret;
+}
+
static virHypervisorDriver bhyveHypervisorDriver = {
.name = "bhyve",
.connectOpen = bhyveConnectOpen, /* 1.2.2 */
@@ -1592,6 +1647,7 @@ static virHypervisorDriver bhyveHypervisorDriver = {
.connectIsAlive = bhyveConnectIsAlive, /* 1.3.5 */
.connectIsSecure = bhyveConnectIsSecure, /* 1.3.5 */
.connectIsEncrypted = bhyveConnectIsEncrypted, /* 1.3.5 */
+ .connectGetDomainCapabilities = bhyveConnectGetDomainCapabilities, /* 2.1.0 */
};
--
2.5.5