[PATCH v2 05/10] hyperv: implement connectGetCapabilities
Neal Gompa
ngompa13 at gmail.com
Tue Oct 6 00:59:12 UTC 2020
On Mon, Oct 5, 2020 at 12:21 PM Matt Coleman <mcoleman at datto.com> wrote:
>
> Co-authored-by: Sri Ramanujam <sramanujam at datto.com>
> Signed-off-by: Matt Coleman <matt at datto.com>
> ---
> src/hyperv/hyperv_driver.c | 90 +++++++++++++++++++++++++++++++++++++
> src/hyperv/hyperv_private.h | 2 +
> 2 files changed, 92 insertions(+)
>
> diff --git a/src/hyperv/hyperv_driver.c b/src/hyperv/hyperv_driver.c
> index 3e4563252e..93e08c54c0 100644
> --- a/src/hyperv/hyperv_driver.c
> +++ b/src/hyperv/hyperv_driver.c
> @@ -36,6 +36,7 @@
> #include "openwsman.h"
> #include "virstring.h"
> #include "virkeycode.h"
> +#include "domain_conf.h"
>
> #define VIR_FROM_THIS VIR_FROM_HYPERV
>
> @@ -283,6 +284,76 @@ hypervGetMemSDByVSSDInstanceId(hypervPrivate *priv, const char *id,
>
>
>
> +/*
> + * API-specific utility functions
> + */
> +
> +static int
> +hypervLookupHostSystemBiosUuid(hypervPrivate *priv, unsigned char *uuid)
> +{
> + Win32_ComputerSystemProduct *computerSystem = NULL;
> + g_auto(virBuffer) query = VIR_BUFFER_INITIALIZER;
> + int result = -1;
> +
> + virBufferAddLit(&query, WIN32_COMPUTERSYSTEMPRODUCT_WQL_SELECT);
> + if (hypervGetWmiClass(Win32_ComputerSystemProduct, &computerSystem) < 0)
> + goto cleanup;
> +
> + if (virUUIDParse(computerSystem->data.common->UUID, uuid) < 0) {
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("Could not parse UUID from string '%s'"),
> + computerSystem->data.common->UUID);
> + goto cleanup;
> + }
> + result = 0;
> +
> + cleanup:
> + hypervFreeObject(priv, (hypervObject *) computerSystem);
> +
> + return result;
> +}
> +
> +static virCapsPtr
> +hypervCapsInit(hypervPrivate *priv)
> +{
> + virCapsPtr caps = NULL;
> + virCapsGuestPtr guest = NULL;
> +
> + caps = virCapabilitiesNew(VIR_ARCH_X86_64, 1, 1);
> +
> + if (!caps)
> + return NULL;
> +
> + if (hypervLookupHostSystemBiosUuid(priv, caps->host.host_uuid) < 0)
> + goto error;
> +
> + /* i686 caps */
> + guest = virCapabilitiesAddGuest(caps, VIR_DOMAIN_OSTYPE_HVM, VIR_ARCH_I686,
> + NULL, NULL, 0, NULL);
> + if (!guest)
> + goto error;
> +
> + if (!virCapabilitiesAddGuestDomain(guest, VIR_DOMAIN_VIRT_HYPERV, NULL, NULL, 0, NULL))
> + goto error;
> +
> + /* x86_64 caps */
> + guest = virCapabilitiesAddGuest(caps, VIR_DOMAIN_OSTYPE_HVM, VIR_ARCH_X86_64,
> + NULL, NULL, 0, NULL);
> + if (!guest)
> + goto error;
> +
> + if (!virCapabilitiesAddGuestDomain(guest, VIR_DOMAIN_VIRT_HYPERV, NULL, NULL, 0, NULL))
> + goto error;
> +
> + return caps;
> +
> + error:
> + virObjectUnref(caps);
> + return NULL;
> +}
> +
> +
> +
> /*
> * Driver functions
> */
> @@ -298,6 +369,9 @@ hypervFreePrivate(hypervPrivate **priv)
> wsmc_release((*priv)->client);
> }
>
> + if ((*priv)->caps)
> + virObjectUnref((*priv)->caps);
> +
> hypervFreeParsedUri(&(*priv)->parsedUri);
> VIR_FREE(*priv);
> }
> @@ -408,6 +482,11 @@ hypervConnectOpen(virConnectPtr conn, virConnectAuthPtr auth,
> if (hypervInitConnection(conn, priv, username, password) < 0)
> goto cleanup;
>
> + /* set up capabilities */
> + priv->caps = hypervCapsInit(priv);
> + if (!priv->caps)
> + goto cleanup;
> +
> conn->privateData = priv;
> priv = NULL;
> result = VIR_DRV_OPEN_SUCCESS;
> @@ -464,6 +543,16 @@ hypervConnectGetHostname(virConnectPtr conn)
>
>
>
> +static char*
> +hypervConnectGetCapabilities(virConnectPtr conn)
> +{
> + hypervPrivate *priv = conn->privateData;
> +
> + return virCapabilitiesFormatXML(priv->caps);
> +}
> +
> +
> +
> static int
> hypervNodeGetInfo(virConnectPtr conn, virNodeInfoPtr info)
> {
> @@ -1601,6 +1690,7 @@ static virHypervisorDriver hypervHypervisorDriver = {
> .connectGetType = hypervConnectGetType, /* 0.9.5 */
> .connectGetHostname = hypervConnectGetHostname, /* 0.9.5 */
> .nodeGetInfo = hypervNodeGetInfo, /* 0.9.5 */
> + .connectGetCapabilities = hypervConnectGetCapabilities, /* 6.9.0 */
> .connectListDomains = hypervConnectListDomains, /* 0.9.5 */
> .connectNumOfDomains = hypervConnectNumOfDomains, /* 0.9.5 */
> .connectListAllDomains = hypervConnectListAllDomains, /* 0.10.2 */
> diff --git a/src/hyperv/hyperv_private.h b/src/hyperv/hyperv_private.h
> index b502e71d83..cf08bf542b 100644
> --- a/src/hyperv/hyperv_private.h
> +++ b/src/hyperv/hyperv_private.h
> @@ -26,6 +26,7 @@
> #include "virerror.h"
> #include "hyperv_util.h"
> #include "openwsman.h"
> +#include "capabilities.h"
>
> typedef enum _hypervWmiVersion hypervWmiVersion;
> enum _hypervWmiVersion {
> @@ -38,4 +39,5 @@ struct _hypervPrivate {
> hypervParsedUri *parsedUri;
> WsManClient *client;
> hypervWmiVersion wmiVersion;
> + virCapsPtr caps;
> };
> --
> 2.27.0
>
>
Reviewed-by: Neal Gompa <ngompa13 at gmail.com>
--
真実はいつも一つ!/ Always, there's only one truth!
More information about the libvir-list
mailing list