hyperv: Add basic driver for Microsoft Hyper-V

Domain listing, basic information retrieval and domain life cycle
management is implemented. But currently the domain XML output
lacks the complete devices section.

The driver uses OpenWSMAN to directly communicate with a Hyper-V
server over its WS-Management interface exposed via Microsoft WinRM.

The driver is based on the work of Michael Sievers. This started in
the same master program project group at the University of Paderborn
as the ESX driver.

See Michael's blog for details: http://hyperv4libvirt.wordpress.com/
This commit is contained in:
Matthias Bolte 2011-07-13 17:16:47 +02:00
parent e224b6f8fb
commit 5e3b0f8b57
6 changed files with 1370 additions and 2 deletions

View File

@ -29,6 +29,7 @@ src/esx/esx_vi_methods.c
src/esx/esx_vi_types.c
src/fdstream.c
src/hyperv/hyperv_driver.c
src/hyperv/hyperv_util.c
src/hyperv/hyperv_wmi.c
src/interface/netcf_driver.c
src/internal.h

View File

@ -412,6 +412,7 @@ HYPERV_DRIVER_SOURCES = \
hyperv/hyperv_device_monitor.c hyperv/hyperv_device_monitor.h \
hyperv/hyperv_secret_driver.c hyperv/hyperv_secret_driver.h \
hyperv/hyperv_nwfilter_driver.c hyperv/hyperv_nwfilter_driver.h \
hyperv/hyperv_util.c hyperv/hyperv_util.h \
hyperv/hyperv_wmi.c hyperv/hyperv_wmi.h \
hyperv/hyperv_wmi_classes.c hyperv/hyperv_wmi_classes.h \
hyperv/openwsman.h

File diff suppressed because it is too large Load Diff

View File

@ -26,6 +26,7 @@
# include "internal.h"
# include "virterror_internal.h"
# include "hyperv_util.h"
# include "openwsman.h"
# define HYPERV_ERROR(code, ...) \
@ -35,6 +36,7 @@
typedef struct _hypervPrivate hypervPrivate;
struct _hypervPrivate {
hypervParsedUri *parsedUri;
WsManClient *client;
};

129
src/hyperv/hyperv_util.c Normal file
View File

@ -0,0 +1,129 @@
/*
* hyperv_util.c: utility functions for the Microsoft Hyper-V driver
*
* Copyright (C) 2011 Matthias Bolte <matthias.bolte@googlemail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
#include <config.h>
#include "internal.h"
#include "datatypes.h"
#include "qparams.h"
#include "util.h"
#include "memory.h"
#include "logging.h"
#include "uuid.h"
#include "hyperv_private.h"
#include "hyperv_util.h"
#define VIR_FROM_THIS VIR_FROM_HYPERV
int
hypervParseUri(hypervParsedUri **parsedUri, xmlURIPtr uri)
{
int result = -1;
struct qparam_set *queryParamSet = NULL;
struct qparam *queryParam = NULL;
int i;
if (parsedUri == NULL || *parsedUri != NULL) {
HYPERV_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Invalid argument"));
return -1;
}
if (VIR_ALLOC(*parsedUri) < 0) {
virReportOOMError();
return -1;
}
#ifdef HAVE_XMLURI_QUERY_RAW
queryParamSet = qparam_query_parse(uri->query_raw);
#else
queryParamSet = qparam_query_parse(uri->query);
#endif
if (queryParamSet == NULL) {
goto cleanup;
}
for (i = 0; i < queryParamSet->n; i++) {
queryParam = &queryParamSet->p[i];
if (STRCASEEQ(queryParam->name, "transport")) {
VIR_FREE((*parsedUri)->transport);
(*parsedUri)->transport = strdup(queryParam->value);
if ((*parsedUri)->transport == NULL) {
virReportOOMError();
goto cleanup;
}
if (STRNEQ((*parsedUri)->transport, "http") &&
STRNEQ((*parsedUri)->transport, "https")) {
HYPERV_ERROR(VIR_ERR_INVALID_ARG,
_("Query parameter 'transport' has unexpected value "
"'%s' (should be http|https)"),
(*parsedUri)->transport);
goto cleanup;
}
} else {
VIR_WARN("Ignoring unexpected query parameter '%s'",
queryParam->name);
}
}
if ((*parsedUri)->transport == NULL) {
(*parsedUri)->transport = strdup("https");
if ((*parsedUri)->transport == NULL) {
virReportOOMError();
goto cleanup;
}
}
result = 0;
cleanup:
if (result < 0) {
hypervFreeParsedUri(parsedUri);
}
if (queryParamSet != NULL) {
free_qparam_set(queryParamSet);
}
return result;
}
void
hypervFreeParsedUri(hypervParsedUri **parsedUri)
{
if (parsedUri == NULL || *parsedUri == NULL) {
return;
}
VIR_FREE((*parsedUri)->transport);
VIR_FREE(*parsedUri);
}

40
src/hyperv/hyperv_util.h Normal file
View File

@ -0,0 +1,40 @@
/*
* hyperv_util.h: utility functions for the Microsoft Hyper-V driver
*
* Copyright (C) 2011 Matthias Bolte <matthias.bolte@googlemail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
#ifndef __HYPERV_UTIL_H__
# define __HYPERV_UTIL_H__
# include <libxml/uri.h>
# include "internal.h"
typedef struct _hypervParsedUri hypervParsedUri;
struct _hypervParsedUri {
char *transport;
};
int hypervParseUri(hypervParsedUri **parsedUri, xmlURIPtr uri);
void hypervFreeParsedUri(hypervParsedUri **parsedUri);
#endif /* __HYPERV_UTIL_H__ */