[libvirt] [PATCH] esx: Add stubs for secondary driver types
by Matthias Bolte
This stops libvirt from probing for a libvirtd on the ESX server and
sets the base for the implementation of the secondary drivers.
---
src/Makefile.am | 5 ++
src/esx/esx_device_monitor.c | 93 +++++++++++++++++++++++++++++++
src/esx/esx_device_monitor.h | 29 ++++++++++
src/esx/esx_driver.c | 28 +++++-----
src/esx/esx_driver.h | 20 +++++++-
src/esx/esx_interface_driver.c | 96 ++++++++++++++++++++++++++++++++
src/esx/esx_interface_driver.h | 29 ++++++++++
src/esx/esx_network_driver.c | 101 ++++++++++++++++++++++++++++++++++
src/esx/esx_network_driver.h | 29 ++++++++++
src/esx/esx_secret_driver.c | 91 +++++++++++++++++++++++++++++++
src/esx/esx_secret_driver.h | 28 ++++++++++
src/esx/esx_storage_driver.c | 117 ++++++++++++++++++++++++++++++++++++++++
src/esx/esx_storage_driver.h | 29 ++++++++++
13 files changed, 680 insertions(+), 15 deletions(-)
create mode 100644 src/esx/esx_device_monitor.c
create mode 100644 src/esx/esx_device_monitor.h
create mode 100644 src/esx/esx_interface_driver.c
create mode 100644 src/esx/esx_interface_driver.h
create mode 100644 src/esx/esx_network_driver.c
create mode 100644 src/esx/esx_network_driver.h
create mode 100644 src/esx/esx_secret_driver.c
create mode 100644 src/esx/esx_secret_driver.h
create mode 100644 src/esx/esx_storage_driver.c
create mode 100644 src/esx/esx_storage_driver.h
diff --git a/src/Makefile.am b/src/Makefile.am
index 324030b..7d426ae 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -214,6 +214,11 @@ ONE_DRIVER_SOURCES = \
ESX_DRIVER_SOURCES = \
esx/esx_driver.c esx/esx_driver.h \
+ esx/esx_interface_driver.c esx/esx_interface_driver.h \
+ esx/esx_network_driver.c esx/esx_network_driver.h \
+ esx/esx_storage_driver.c esx/esx_storage_driver.h \
+ esx/esx_device_monitor.c esx/esx_device_monitor.h \
+ esx/esx_secret_driver.c esx/esx_secret_driver.h \
esx/esx_util.c esx/esx_util.h \
esx/esx_vi.c esx/esx_vi.h \
esx/esx_vi_methods.c esx/esx_vi_methods.h \
diff --git a/src/esx/esx_device_monitor.c b/src/esx/esx_device_monitor.c
new file mode 100644
index 0000000..c813adf
--- /dev/null
+++ b/src/esx/esx_device_monitor.c
@@ -0,0 +1,93 @@
+
+/*
+ * esx_device_monitor.c: device monitor methods for managing VMware ESX
+ * host devices
+ *
+ * Copyright (C) 2010 Matthias Bolte <matthias.bolte(a)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 "virterror_internal.h"
+#include "util.h"
+#include "memory.h"
+#include "logging.h"
+#include "uuid.h"
+#include "esx_driver.h"
+#include "esx_device_monitor.h"
+#include "esx_vi.h"
+#include "esx_vi_methods.h"
+#include "esx_util.h"
+
+#define VIR_FROM_THIS VIR_FROM_ESX
+
+#define ESX_ERROR(conn, code, fmt...) \
+ virReportErrorHelper(conn, VIR_FROM_ESX, code, __FILE__, __FUNCTION__, \
+ __LINE__, fmt)
+
+
+
+static virDrvOpenStatus
+esxDeviceOpen(virConnectPtr conn,
+ virConnectAuthPtr auth ATTRIBUTE_UNUSED,
+ int flags ATTRIBUTE_UNUSED)
+{
+ if (STRNEQ(conn->driver->name, "ESX")) {
+ return VIR_DRV_OPEN_DECLINED;
+ }
+
+ conn->devMonPrivateData = conn->privateData;
+
+ return VIR_DRV_OPEN_SUCCESS;
+}
+
+
+
+static int
+esxDeviceClose(virConnectPtr conn)
+{
+ conn->devMonPrivateData = NULL;
+
+ return 0;
+}
+
+
+
+static virDeviceMonitor esxDeviceMonitor = {
+ "ESX", /* name */
+ esxDeviceOpen, /* open */
+ esxDeviceClose, /* close */
+ NULL, /* numOfDevices */
+ NULL, /* listDevices */
+ NULL, /* deviceLookupByName */
+ NULL, /* deviceDumpXML */
+ NULL, /* deviceGetParent */
+ NULL, /* deviceNumOfCaps */
+ NULL, /* deviceListCaps */
+ NULL, /* deviceCreateXML */
+ NULL, /* deviceDestroy */
+};
+
+
+
+int
+esxDeviceRegister(void)
+{
+ return virRegisterDeviceMonitor(&esxDeviceMonitor);
+}
diff --git a/src/esx/esx_device_monitor.h b/src/esx/esx_device_monitor.h
new file mode 100644
index 0000000..e72a5b6
--- /dev/null
+++ b/src/esx/esx_device_monitor.h
@@ -0,0 +1,29 @@
+
+/*
+ * esx_device_monitor.h: device monitor methods for managing VMware ESX
+ * host devices
+ *
+ * Copyright (C) 2010 Matthias Bolte <matthias.bolte(a)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 __ESX_DEVICE_MONITOR_H__
+#define __ESX_DEVICE_MONITOR_H__
+
+int esxDeviceRegister(void);
+
+#endif /* __ESX_DEVICE_MONITOR_H__ */
diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c
index ddda66e..5aa3237 100644
--- a/src/esx/esx_driver.c
+++ b/src/esx/esx_driver.c
@@ -2,7 +2,7 @@
/*
* esx_driver.c: core driver methods for managing VMware ESX hosts
*
- * Copyright (C) 2009 Matthias Bolte <matthias.bolte(a)googlemail.com>
+ * Copyright (C) 2009, 2010 Matthias Bolte <matthias.bolte(a)googlemail.com>
* Copyright (C) 2009 Maximilian Wilhelm <max(a)rfc2324.org>
*
* This library is free software; you can redistribute it and/or
@@ -33,6 +33,11 @@
#include "logging.h"
#include "uuid.h"
#include "esx_driver.h"
+#include "esx_interface_driver.h"
+#include "esx_network_driver.h"
+#include "esx_storage_driver.h"
+#include "esx_device_monitor.h"
+#include "esx_secret_driver.h"
#include "esx_vi.h"
#include "esx_vi_methods.h"
#include "esx_util.h"
@@ -46,18 +51,6 @@
static int esxDomainGetMaxVcpus(virDomainPtr domain);
-typedef struct _esxPrivate {
- esxVI_Context *host;
- esxVI_Context *vCenter;
- virCapsPtr caps;
- char *transport;
- int32_t maxVcpus;
- esxVI_Boolean supportsVMotion;
- esxVI_Boolean supportsLongMode; /* aka x86_64 */
- esxVI_Boolean autoAnswer;
- int32_t usedCpuTimeCounterId;
-} esxPrivate;
-
static esxVI_Boolean
@@ -3479,7 +3472,14 @@ static virDriver esxDriver = {
int
esxRegister(void)
{
- virRegisterDriver(&esxDriver);
+ if (virRegisterDriver(&esxDriver) < 0 ||
+ esxInterfaceRegister() < 0 ||
+ esxNetworkRegister() < 0 ||
+ esxStorageRegister() < 0 ||
+ esxDeviceRegister() < 0 ||
+ esxSecretRegister() < 0) {
+ return -1;
+ }
return 0;
}
diff --git a/src/esx/esx_driver.h b/src/esx/esx_driver.h
index 85f4b32..18e821b 100644
--- a/src/esx/esx_driver.h
+++ b/src/esx/esx_driver.h
@@ -2,7 +2,7 @@
/*
* esx_driver.h: core driver methods for managing VMware ESX hosts
*
- * Copyright (C) 2009 Matthias Bolte <matthias.bolte(a)googlemail.com>
+ * Copyright (C) 2009, 2010 Matthias Bolte <matthias.bolte(a)googlemail.com>
* Copyright (C) 2009 Maximilian Wilhelm <max(a)rfc2324.org>
*
* This library is free software; you can redistribute it and/or
@@ -24,6 +24,24 @@
#ifndef __ESX_DRIVER_H__
#define __ESX_DRIVER_H__
+#include "internal.h"
+#include "capabilities.h"
+#include "esx_vi.h"
+
+typedef struct _esxPrivate {
+ esxVI_Context *host;
+ esxVI_Context *vCenter;
+ virCapsPtr caps;
+ char *transport;
+ int32_t maxVcpus;
+ esxVI_Boolean supportsVMotion;
+ esxVI_Boolean supportsLongMode; /* aka x86_64 */
+ esxVI_Boolean autoAnswer;
+ int32_t usedCpuTimeCounterId;
+} esxPrivate;
+
+
+
int esxRegister(void);
#endif /* __ESX_DRIVER_H__ */
diff --git a/src/esx/esx_interface_driver.c b/src/esx/esx_interface_driver.c
new file mode 100644
index 0000000..7664e4a
--- /dev/null
+++ b/src/esx/esx_interface_driver.c
@@ -0,0 +1,96 @@
+
+/*
+ * esx_interface_driver.h: interface driver methods for managing VMware ESX
+ * host interfaces
+ *
+ * Copyright (C) 2010 Matthias Bolte <matthias.bolte(a)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 "virterror_internal.h"
+#include "util.h"
+#include "memory.h"
+#include "logging.h"
+#include "uuid.h"
+#include "esx_driver.h"
+#include "esx_interface_driver.h"
+#include "esx_vi.h"
+#include "esx_vi_methods.h"
+#include "esx_util.h"
+
+#define VIR_FROM_THIS VIR_FROM_ESX
+
+#define ESX_ERROR(conn, code, fmt...) \
+ virReportErrorHelper(conn, VIR_FROM_ESX, code, __FILE__, __FUNCTION__, \
+ __LINE__, fmt)
+
+
+
+static virDrvOpenStatus
+esxInterfaceOpen(virConnectPtr conn,
+ virConnectAuthPtr auth ATTRIBUTE_UNUSED,
+ int flags ATTRIBUTE_UNUSED)
+{
+ if (STRNEQ(conn->driver->name, "ESX")) {
+ return VIR_DRV_OPEN_DECLINED;
+ }
+
+ conn->interfacePrivateData = conn->privateData;
+
+ return VIR_DRV_OPEN_SUCCESS;
+}
+
+
+
+static int
+esxInterfaceClose(virConnectPtr conn)
+{
+ conn->interfacePrivateData = NULL;
+
+ return 0;
+}
+
+
+
+static virInterfaceDriver esxInterfaceDriver = {
+ "ESX", /* name */
+ esxInterfaceOpen, /* open */
+ esxInterfaceClose, /* close */
+ NULL, /* numOfInterfaces */
+ NULL, /* listInterfaces */
+ NULL, /* numOfDefinedInterfaces */
+ NULL, /* listDefinedInterfaces */
+ NULL, /* interfaceLookupByName */
+ NULL, /* interfaceLookupByMACString */
+ NULL, /* interfaceGetXMLDesc */
+ NULL, /* interfaceDefineXML */
+ NULL, /* interfaceUndefine */
+ NULL, /* interfaceCreate */
+ NULL, /* interfaceDestroy */
+ NULL, /* interfaceIsActive */
+};
+
+
+
+int
+esxInterfaceRegister(void)
+{
+ return virRegisterInterfaceDriver(&esxInterfaceDriver);
+}
diff --git a/src/esx/esx_interface_driver.h b/src/esx/esx_interface_driver.h
new file mode 100644
index 0000000..d30641a
--- /dev/null
+++ b/src/esx/esx_interface_driver.h
@@ -0,0 +1,29 @@
+
+/*
+ * esx_interface_driver.h: interface driver methods for managing VMware ESX
+ * host interfaces
+ *
+ * Copyright (C) 2010 Matthias Bolte <matthias.bolte(a)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 __ESX_INTERFACE_DRIVER_H__
+#define __ESX_INTERFACE_DRIVER_H__
+
+int esxInterfaceRegister(void);
+
+#endif /* __ESX_INTERFACE_DRIVER_H__ */
diff --git a/src/esx/esx_network_driver.c b/src/esx/esx_network_driver.c
new file mode 100644
index 0000000..9532352
--- /dev/null
+++ b/src/esx/esx_network_driver.c
@@ -0,0 +1,101 @@
+
+/*
+ * esx_network_driver.c: network driver methods for managing VMware ESX
+ * host networks
+ *
+ * Copyright (C) 2010 Matthias Bolte <matthias.bolte(a)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 "virterror_internal.h"
+#include "util.h"
+#include "memory.h"
+#include "logging.h"
+#include "uuid.h"
+#include "esx_driver.h"
+#include "esx_network_driver.h"
+#include "esx_vi.h"
+#include "esx_vi_methods.h"
+#include "esx_util.h"
+
+#define VIR_FROM_THIS VIR_FROM_ESX
+
+#define ESX_ERROR(conn, code, fmt...) \
+ virReportErrorHelper(conn, VIR_FROM_ESX, code, __FILE__, __FUNCTION__, \
+ __LINE__, fmt)
+
+
+
+static virDrvOpenStatus
+esxNetworkOpen(virConnectPtr conn,
+ virConnectAuthPtr auth ATTRIBUTE_UNUSED,
+ int flags ATTRIBUTE_UNUSED)
+{
+ if (STRNEQ(conn->driver->name, "ESX")) {
+ return VIR_DRV_OPEN_DECLINED;
+ }
+
+ conn->networkPrivateData = conn->privateData;
+
+ return VIR_DRV_OPEN_SUCCESS;
+}
+
+
+
+static int
+esxNetworkClose(virConnectPtr conn)
+{
+ conn->networkPrivateData = NULL;
+
+ return 0;
+}
+
+
+
+static virNetworkDriver esxNetworkDriver = {
+ "ESX", /* name */
+ esxNetworkOpen, /* open */
+ esxNetworkClose, /* close */
+ NULL, /* numOfNetworks */
+ NULL, /* listNetworks */
+ NULL, /* numOfDefinedNetworks */
+ NULL, /* listDefinedNetworks */
+ NULL, /* networkLookupByUUID */
+ NULL, /* networkLookupByName */
+ NULL, /* networkCreateXML */
+ NULL, /* networkDefineXML */
+ NULL, /* networkUndefine */
+ NULL, /* networkCreate */
+ NULL, /* networkDestroy */
+ NULL, /* networkDumpXML */
+ NULL, /* networkGetBridgeName */
+ NULL, /* networkGetAutostart */
+ NULL, /* networkSetAutostart */
+ NULL, /* networkIsActive */
+ NULL, /* networkIsPersistent */
+};
+
+
+
+int
+esxNetworkRegister(void)
+{
+ return virRegisterNetworkDriver(&esxNetworkDriver);
+}
diff --git a/src/esx/esx_network_driver.h b/src/esx/esx_network_driver.h
new file mode 100644
index 0000000..f117e03
--- /dev/null
+++ b/src/esx/esx_network_driver.h
@@ -0,0 +1,29 @@
+
+/*
+ * esx_network_driver.h: network driver methods for managing VMware ESX
+ * host networks
+ *
+ * Copyright (C) 2010 Matthias Bolte <matthias.bolte(a)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 __ESX_NETWORK_DRIVER_H__
+#define __ESX_NETWORK_DRIVER_H__
+
+int esxNetworkRegister(void);
+
+#endif /* __ESX_NETWORK_DRIVER_H__ */
diff --git a/src/esx/esx_secret_driver.c b/src/esx/esx_secret_driver.c
new file mode 100644
index 0000000..e451b13
--- /dev/null
+++ b/src/esx/esx_secret_driver.c
@@ -0,0 +1,91 @@
+
+/*
+ * esx_secret_driver.c: secret driver methods for VMware ESX secret manipulation
+ *
+ * Copyright (C) 2010 Matthias Bolte <matthias.bolte(a)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 "virterror_internal.h"
+#include "util.h"
+#include "memory.h"
+#include "logging.h"
+#include "uuid.h"
+#include "esx_driver.h"
+#include "esx_secret_driver.h"
+#include "esx_vi.h"
+#include "esx_vi_methods.h"
+#include "esx_util.h"
+
+#define VIR_FROM_THIS VIR_FROM_ESX
+
+#define ESX_ERROR(conn, code, fmt...) \
+ virReportErrorHelper(conn, VIR_FROM_ESX, code, __FILE__, __FUNCTION__, \
+ __LINE__, fmt)
+
+
+
+static virDrvOpenStatus
+esxSecretOpen(virConnectPtr conn, virConnectAuthPtr auth ATTRIBUTE_UNUSED,
+ int flags ATTRIBUTE_UNUSED)
+{
+ if (STRNEQ(conn->driver->name, "ESX")) {
+ return VIR_DRV_OPEN_DECLINED;
+ }
+
+ conn->secretPrivateData = conn->privateData;
+
+ return VIR_DRV_OPEN_SUCCESS;
+}
+
+
+
+static int
+esxSecretClose(virConnectPtr conn)
+{
+ conn->secretPrivateData = NULL;
+
+ return 0;
+}
+
+
+
+static virSecretDriver esxSecretDriver = {
+ "ESX", /* name */
+ esxSecretOpen, /* open */
+ esxSecretClose, /* close */
+ NULL, /* numOfSecrets */
+ NULL, /* listSecrets */
+ NULL, /* lookupByUUID */
+ NULL, /* lookupByUsage */
+ NULL, /* defineXML */
+ NULL, /* getXMLDesc */
+ NULL, /* setValue */
+ NULL, /* getValue */
+ NULL, /* undefine */
+};
+
+
+
+int
+esxSecretRegister(void)
+{
+ return virRegisterSecretDriver(&esxSecretDriver);
+}
diff --git a/src/esx/esx_secret_driver.h b/src/esx/esx_secret_driver.h
new file mode 100644
index 0000000..c0d4a48
--- /dev/null
+++ b/src/esx/esx_secret_driver.h
@@ -0,0 +1,28 @@
+
+/*
+ * esx_secret_driver.h: secret driver methods for VMware ESX secret manipulation
+ *
+ * Copyright (C) 2010 Matthias Bolte <matthias.bolte(a)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 __ESX_SECRET_DRIVER_H__
+#define __ESX_SECRET_DRIVER_H__
+
+int esxSecretRegister(void);
+
+#endif /* __ESX_SECRET_DRIVER_H__ */
diff --git a/src/esx/esx_storage_driver.c b/src/esx/esx_storage_driver.c
new file mode 100644
index 0000000..7e9b98d
--- /dev/null
+++ b/src/esx/esx_storage_driver.c
@@ -0,0 +1,117 @@
+
+/*
+ * esx_storage_driver.c: storage driver methods for managing VMware ESX
+ * host storage
+ *
+ * Copyright (C) 2010 Matthias Bolte <matthias.bolte(a)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 "virterror_internal.h"
+#include "util.h"
+#include "memory.h"
+#include "logging.h"
+#include "uuid.h"
+#include "esx_driver.h"
+#include "esx_storage_driver.h"
+#include "esx_vi.h"
+#include "esx_vi_methods.h"
+#include "esx_util.h"
+
+#define VIR_FROM_THIS VIR_FROM_ESX
+
+#define ESX_ERROR(conn, code, fmt...) \
+ virReportErrorHelper(conn, VIR_FROM_ESX, code, __FILE__, __FUNCTION__, \
+ __LINE__, fmt)
+
+
+
+static virDrvOpenStatus
+esxStorageOpen(virConnectPtr conn,
+ virConnectAuthPtr auth ATTRIBUTE_UNUSED,
+ int flags ATTRIBUTE_UNUSED)
+{
+ if (STRNEQ(conn->driver->name, "ESX")) {
+ return VIR_DRV_OPEN_DECLINED;
+ }
+
+ conn->storagePrivateData = conn->privateData;
+
+ return VIR_DRV_OPEN_SUCCESS;
+}
+
+
+
+static int
+esxStorageClose(virConnectPtr conn)
+{
+ conn->storagePrivateData = NULL;
+
+ return 0;
+}
+
+
+
+static virStorageDriver esxStorageDriver = {
+ "ESX", /* name */
+ esxStorageOpen, /* open */
+ esxStorageClose, /* close */
+ NULL, /* numOfPools */
+ NULL, /* listPools */
+ NULL, /* numOfDefinedPools */
+ NULL, /* listDefinedPools */
+ NULL, /* findPoolSources */
+ NULL, /* poolLookupByName */
+ NULL, /* poolLookupByUUID */
+ NULL, /* poolLookupByVolume */
+ NULL, /* poolCreateXML */
+ NULL, /* poolDefineXML */
+ NULL, /* poolBuild */
+ NULL, /* poolUndefine */
+ NULL, /* poolCreate */
+ NULL, /* poolDestroy */
+ NULL, /* poolDelete */
+ NULL, /* poolRefresh */
+ NULL, /* poolGetInfo */
+ NULL, /* poolGetXMLDesc */
+ NULL, /* poolGetAutostart */
+ NULL, /* poolSetAutostart */
+ NULL, /* poolNumOfVolumes */
+ NULL, /* poolListVolumes */
+ NULL, /* volLookupByName */
+ NULL, /* volLookupByKey */
+ NULL, /* volLookupByPath */
+ NULL, /* volCreateXML */
+ NULL, /* volCreateXMLFrom */
+ NULL, /* volDelete */
+ NULL, /* volGetInfo */
+ NULL, /* volGetXMLDesc */
+ NULL, /* volGetPath */
+ NULL, /* poolIsActive */
+ NULL, /* poolIsPersistent */
+};
+
+
+
+int
+esxStorageRegister(void)
+{
+ return virRegisterStorageDriver(&esxStorageDriver);
+}
diff --git a/src/esx/esx_storage_driver.h b/src/esx/esx_storage_driver.h
new file mode 100644
index 0000000..91a5d03
--- /dev/null
+++ b/src/esx/esx_storage_driver.h
@@ -0,0 +1,29 @@
+
+/*
+ * esx_storage_driver.h: storage driver methods for managing VMware ESX
+ * host storage
+ *
+ * Copyright (C) 2010 Matthias Bolte <matthias.bolte(a)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 __ESX_STORAGE_DRIVER_H__
+#define __ESX_STORAGE_DRIVER_H__
+
+int esxStorageRegister(void);
+
+#endif /* __ESX_STORAGE_DRIVER_H__ */
--
1.6.3.3
14 years, 10 months
[libvirt] LVM storage pool with existing mirrored volumes
by Ben Roberts
Hi,
I tried to setup a lvm-backed storage pool, reusing an existing volume
group which already contains a handful of mirrored logical volumes.
For reference, I am using lvm 2.02.56-r3, qemu-kvm 0.12.1.2 and libvirt
0.7.5 on an up-to-date ~amd64 gentoo system.
The first issue I encountered is when trying to activate the storage
pool, the process fails with "internal error lvs command failed". This
appears to be because the output of lvs is slightly different when using
mirrored lvs, and is breaking the parser:
/sbin/lvs --separator , --noheadings --units b --unbuffered --nosuffix
--options lv_name,origin,uuid,devices,seg_size,vg_extent_size bigpool
vms,,0PzrRS-8Ljs-SUq0-ywFH-BI3d-RI0V-aibupu,vms_mimage_0(0),vms_mimage_1(0),107374182400,4194304
backups,,Snk2NL-oJe3-GpTL-Qihs-ZjjG-xPyj-ufmwCp,backups_mimage_0(0),backups_mimage_1(0),214748364800,4194304
The device column of output would normally contain something like
"/dev/sda(1234)", but here contains "vms_mimage_0(0),vms_mimage_1(0).
This is causing the parser to misinterpret the output, and it believes
the lv name to be suffixed with a trailing comma, eg "vms,". When trying
to access "/dev/bigpool/vms,", the command errors with File or Directory
not Found.
When adding the --all parameter to lvs, the hidden mirroring lvs are
visible, and these have the expected structure:
vms,,0PzrRS-8Ljs-SUq0-ywFH-BI3d-RI0V-aibupu,vms_mimage_0(0),vms_mimage_1(0),107374182400,4194304
[vms_mlog],,vnOzg8-ynKc-kM8F-RKdM-xXC0-PJlG-qcgmFh,/dev/sda2(0),4194304,4194304
[vms_mimage_0],,2pXjHt-aARa-FOO7-ZL6N-ahpu-ebdr-P6Qxj3,/dev/sdb1(0),107374182400,4194304
[vms_mimage_1],,ITd8CT-JpKi-Y2a6-a4jc-2yDa-9VmG-gWgRd8,/dev/sdc1(51200),107374182400,4194304
Presumably, without the --all parameter and listing the internal
mirroring volumes, libvirt will miscalculate sizes of LVs in the VG.
This bug appears to prevent the use of any volume group which contains
one or more mirrored logical volumes as a backend storage pool.
--
Ben Roberts
Computer Science MEng, Part IV
Electronics and Computer Science, University of Southampton
14 years, 10 months
[libvirt] [PATCH] Man page for LXC BZ 528709
by David Jorm
--- a/tools/virsh.pod
+++ b/tools/virsh.pod
@@ -114,6 +114,10 @@ allow to connect locally as root to the daemon supervising QEmu and KVM domains
allow to connect locally as a normal user to his own set of QEmu and KVM domains
+=item lxc:///
+
+connect to a local linux container
+
=back
For remote access see the documentation page on how to make URIs.
14 years, 10 months
[libvirt] [PATCH] Man page BZ 548485
by David Jorm
--- a/tools/virsh.pod
+++ b/tools/virsh.pod
@@ -342,7 +342,15 @@ severed upon restore, as TCP timeouts may have expired.
=item B<schedinfo> optional I<--weight> B<number> optional I<--cap> B<number> I<domain-id>
-Allows to show (and set) the domain scheduler parameters.
+Allows you to show (and set) the domain scheduler parameters. The parameters available for each hypervisor are:
+
+LXC, QEMU/KVM (posix scheduler): cpu_shares
+
+Xen (credit scheduler): weight, cap
+
+ESX (allocation scheduler): reservation, limit, shares
+
+B<Note>: The cpu_shares parameter has a valid value range of 0-262144.
B<Note>: The weight and cap parameters are defined only for the
XEN_CREDIT scheduler and are now I<DEPRECATED>.
14 years, 10 months
[libvirt] [PATCH] Minor fixes for API extension doc
by Jim Fehlig
Update the API Extensions doc to reflect new source directory layout.
---
docs/api_extension.html.in | 8 ++++----
1 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/docs/api_extension.html.in b/docs/api_extension.html.in
index 59d3414..de6eedc 100644
--- a/docs/api_extension.html.in
+++ b/docs/api_extension.html.in
@@ -178,7 +178,7 @@
involves making two additions to:
</p>
- <p><code>qemud/remote_protocol.x</code></p>
+ <p><code>src/remote/remote_protocol.x</code></p>
<p>
First, create two new structs for each new function that you're adding
@@ -198,7 +198,7 @@
<p>
Once these changes are in place, it's necessary to run 'make rpcgen'
- in the qemud directory to create the .c and .h files required by the
+ in the src directory to create the .c and .h files required by the
remote protocol code. This must be done on a Linux host using the
GLibC rpcgen program. Other rpcgen versions may generate code which
results in bogus compile time warnings
@@ -213,7 +213,7 @@
the rpcgen generated .h files. The remote method calls go in:
</p>
- <p><code>src/remote_internal.c</code></p>
+ <p><code>src/remote/remote_internal.c</code></p>
<p>Each remote method invocation does the following:</p>
@@ -243,7 +243,7 @@
The server side dispatchers are implemented in:
</p>
- <p><code>qemud/remote.c</code></p>
+ <p><code>daemon/remote.c</code></p>
<p>Again, this step uses the .h files generated by make rpcgen.</p>
--
1.6.0.2
14 years, 10 months
[libvirt] Supressing error messages
by Bryan Kearney
When using the java library, we are seeing libvirt error messages spit
out.. such as:
libvir: Remote error : unable to connect to
'/var/run/libvirt/libvirt-sock': No such file or directory
Is there a means of supressing that logging via the api?
-- bk
14 years, 10 months
[libvirt] [PATCH] Fix validation of news.html
by Matthias Bolte
FYI, I pushed this simple fix.
Matthias
---
docs/news.html.in | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/docs/news.html.in b/docs/news.html.in
index 7e06096..83b394f 100644
--- a/docs/news.html.in
+++ b/docs/news.html.in
@@ -26,7 +26,7 @@ and check the <a href="ChangeLog.html">ChangeLog</a> to gauge progress.</p>
esx: Extend documentation about 'vcenter' and add some about 'auto_answer' (Matthias Bolte),
Fix and improve domain xml video element description (Matthias Bolte),
Fix owner and group in example volume XML (Matthew Booth),
- add missing doc for device <shareable/> option (Daniel Veillard),
+ add missing doc for device <shareable/> option (Daniel Veillard),
add AppArmor test and examples to dist (Jamie Strandboge),
Update location of C# bindings. (Richard Jones),
Fix typo in QEMU driver webpage (Daniel P. Berrange),
--
1.6.3.3
14 years, 10 months
[libvirt] [PATCH] gnulib added a new syntax-check test: use $(VAR), not @VAR@
by Jim Meyering
Updating to newer gnulib also pulled in a new sytnax-check
test that evoked new warnings. No big deal, but I addressed them.
The only trick was to see that the warnings about @SCHEMADIR@
and @SYSCONFDIR@ were false positives. To allow them, I defined
the variable in cfg.mk. See below.
>From 6e76cfe38ba0ccafa7c4e81dcc0af04e31f8f447 Mon Sep 17 00:00:00 2001
From: Jim Meyering <meyering(a)redhat.com>
Date: Fri, 15 Jan 2010 11:09:01 +0100
Subject: [PATCH] gnulib added a new syntax-check test: use $(VAR), not @VAR@
The latter is not officially "wrong", but *is* terribly anachronistic.
I think automake documentation or comments call that syntax obsolescent.
* cfg.mk (_makefile_at_at_check_exceptions): Exempt @SCHEMADIR@
and @SYSCONFDIR@ uses -- there are no Makefile variables for those.
* docs/Makefile.am: Use $(INSTALL), not @INSTALL@.
* examples/dominfo/Makefile.am: Similar.
* examples/domsuspend/Makefile.am: Similar.
* proxy/Makefile.am: Similar.
* python/Makefile.am: Similar.
* python/tests/Makefile.am: Similar.
* src/Makefile.am: Similar.
* tests/Makefile.am: Similar.
---
cfg.mk | 5 ++++-
docs/Makefile.am | 4 ++--
examples/dominfo/Makefile.am | 2 +-
examples/domsuspend/Makefile.am | 2 +-
proxy/Makefile.am | 2 +-
python/Makefile.am | 10 +++++-----
python/tests/Makefile.am | 2 +-
src/Makefile.am | 10 +++++-----
tests/Makefile.am | 2 +-
9 files changed, 21 insertions(+), 18 deletions(-)
diff --git a/cfg.mk b/cfg.mk
index 45d6531..0f2d2a6 100644
--- a/cfg.mk
+++ b/cfg.mk
@@ -1,5 +1,5 @@
# Customize Makefile.maint. -*- makefile -*-
-# Copyright (C) 2003-2009 Free Software Foundation, Inc.
+# Copyright (C) 2003-2010 Free Software Foundation, Inc.
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -265,3 +265,6 @@ ifeq (0,$(MAKELEVEL))
$(error gnulib update required; run ./autogen.sh first)
endif
endif
+
+# Exempt @...@ uses of these symbols.
+_makefile_at_at_check_exceptions = ' && !/(SCHEMA|SYSCONF)DIR/'
diff --git a/docs/Makefile.am b/docs/Makefile.am
index c19e963..eaac627 100644
--- a/docs/Makefile.am
+++ b/docs/Makefile.am
@@ -143,7 +143,7 @@ rebuild: api all
install-data-local:
$(mkinstalldirs) $(DESTDIR)$(HTML_DIR)
- -@INSTALL@ -m 0644 $(srcdir)/FAQ.html \
+ -$(INSTALL) -m 0644 $(srcdir)/FAQ.html \
$(srcdir)/Libxml2-Logo-90x34.gif $(DESTDIR)$(HTML_DIR)
$(mkinstalldirs) $(DESTDIR)$(HTML_DIR)/html
for h in $(apihtml); do \
@@ -152,7 +152,7 @@ install-data-local:
$(INSTALL) -m 0644 $(srcdir)/$$p $(DESTDIR)$(HTML_DIR)/html; done
$(mkinstalldirs) $(DESTDIR)$(DEVHELP_DIR)
for file in $(devhelphtml) $(devhelppng) $(devhelpcss); do \
- @INSTALL@ -m 0644 $(srcdir)/$${file} $(DESTDIR)$(DEVHELP_DIR) ; \
+ $(INSTALL) -m 0644 $(srcdir)/$${file} $(DESTDIR)$(DEVHELP_DIR) ; \
done
uninstall-local:
diff --git a/examples/dominfo/Makefile.am b/examples/dominfo/Makefile.am
index a1694b8..2913e5b 100644
--- a/examples/dominfo/Makefile.am
+++ b/examples/dominfo/Makefile.am
@@ -1,6 +1,6 @@
INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I@srcdir@/include
-LDADDS = @STATIC_BINARIES@ $(WARN_CFLAGS) $(top_builddir)/src/libvirt.la $(COVERAGE_LDFLAGS)
+LDADDS = $(STATIC_BINARIES) $(WARN_CFLAGS) $(top_builddir)/src/libvirt.la $(COVERAGE_LDFLAGS)
noinst_PROGRAMS=info1
diff --git a/examples/domsuspend/Makefile.am b/examples/domsuspend/Makefile.am
index 41e9fdb..14b4205 100644
--- a/examples/domsuspend/Makefile.am
+++ b/examples/domsuspend/Makefile.am
@@ -1,6 +1,6 @@
INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I@srcdir@/include
-LDADDS = @STATIC_BINARIES@ $(WARN_CFLAGS) $(top_builddir)/src/libvirt.la $(COVERAGE_LDFLAGS)
+LDADDS = $(STATIC_BINARIES) $(WARN_CFLAGS) $(top_builddir)/src/libvirt.la $(COVERAGE_LDFLAGS)
noinst_PROGRAMS=suspend
diff --git a/proxy/Makefile.am b/proxy/Makefile.am
index 97d6e5a..aef11ca 100644
--- a/proxy/Makefile.am
+++ b/proxy/Makefile.am
@@ -7,7 +7,7 @@ INCLUDES = -I$(top_srcdir)/gnulib/lib -I../gnulib/lib \
-I@top_srcdir@/src/util \
-I@top_srcdir@/src/conf \
-I@top_srcdir@/src/xen \
- @LIBXML_CFLAGS@ \
+ $(LIBXML_CFLAGS) \
-DPROXY -DLOCALEBASEDIR=\""$(datadir)/locale"\" \
-DGETTEXT_PACKAGE=\"$(PACKAGE)\" $(WARN_CFLAGS) $(XEN_CFLAGS)
diff --git a/python/Makefile.am b/python/Makefile.am
index 58c6729..6b67e38 100644
--- a/python/Makefile.am
+++ b/python/Makefile.am
@@ -37,12 +37,12 @@ pyexec_LTLIBRARIES = libvirtmod.la
libvirtmod_la_SOURCES = libvirt-override.c typewrappers.c libvirt.c libvirt.h
# Python <= 2.4 header files contain a redundant decl, hence we
# need extra flags here
-libvirtmod_la_CFLAGS = @WARN_PYTHON_CFLAGS@
+libvirtmod_la_CFLAGS = $(WARN_PYTHON_CFLAGS)
libvirtmod_la_LDFLAGS = -module -avoid-version -shared -L$(top_builddir)/src/.libs \
- @CYGWIN_EXTRA_LDFLAGS@
+ $(CYGWIN_EXTRA_LDFLAGS)
libvirtmod_la_LIBADD = $(mylibs) \
- @CYGWIN_EXTRA_LIBADD@ @CYGWIN_EXTRA_PYTHON_LIBADD@
+ $(CYGWIN_EXTRA_LIBADD) $(CYGWIN_EXTRA_PYTHON_LIBADD)
GENERATE = generator.py
API_DESC = $(top_srcdir)/docs/libvirt-api.xml $(srcdir)/libvirt-override-api.xml
@@ -61,10 +61,10 @@ $(libvirtmod_la_OBJECTS): $(GENERATED)
install-data-local:
$(mkinstalldirs) $(DESTDIR)$(pyexecdir)
- @INSTALL@ -m 0644 libvirt.py $(DESTDIR)$(pyexecdir)
+ $(INSTALL) -m 0644 libvirt.py $(DESTDIR)$(pyexecdir)
$(mkinstalldirs) $(DESTDIR)$(DOCS_DIR)
@(for doc in $(DOCS) ; \
- do @INSTALL@ -m 0644 $$doc $(DESTDIR)$(DOCS_DIR) ; done)
+ do $(INSTALL) -m 0644 $$doc $(DESTDIR)$(DOCS_DIR) ; done)
uninstall-local:
rm -f $(DESTDIR)$(pyexecdir)/libvirt.py
diff --git a/python/tests/Makefile.am b/python/tests/Makefile.am
index 6011fef..28e24ba 100644
--- a/python/tests/Makefile.am
+++ b/python/tests/Makefile.am
@@ -30,7 +30,7 @@ clean:
install-data-local:
$(mkinstalldirs) $(DESTDIR)$(EXAMPLE_DIR)
-(for test in $(PYTESTS); \
- do @INSTALL@ -m 0644 $(srcdir)/$$test $(DESTDIR)$(EXAMPLE_DIR) ; done)
+ do $(INSTALL) -m 0644 $(srcdir)/$$test $(DESTDIR)$(EXAMPLE_DIR) ; done)
uninstall-local:
for test in $(PYTESTS); do rm -f $(DESTDIR)$(EXAMPLE_DIR)/$$test; done
diff --git a/src/Makefile.am b/src/Makefile.am
index 324030b..af97938 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -800,13 +800,13 @@ libvirt.syms: libvirt_public.syms $(USED_SYM_FILES)
# Empty source list - it merely links a bunch of convenience libs together
libvirt_la_SOURCES =
libvirt_la_LIBADD += \
- @CYGWIN_EXTRA_LIBADD@ ../gnulib/lib/libgnu.la
+ $(CYGWIN_EXTRA_LIBADD) ../gnulib/lib/libgnu.la
libvirt_la_LDFLAGS = $(VERSION_SCRIPT_FLAGS)libvirt.syms \
- -version-info @LIBVIRT_VERSION_INFO@ \
+ -version-info $(LIBVIRT_VERSION_INFO) \
$(COVERAGE_CFLAGS:-f%=-Wc,-f%) \
$(LIBXML_LIBS) \
$(DRIVER_MODULE_LIBS) \
- @CYGWIN_EXTRA_LDFLAGS@ @MINGW_EXTRA_LDFLAGS@
+ $(CYGWIN_EXTRA_LDFLAGS) $(MINGW_EXTRA_LDFLAGS)
libvirt_la_CFLAGS = $(COVERAGE_CFLAGS) -DIN_LIBVIRT
libvirt_la_DEPENDENCIES = $(libvirt_la_LIBADD) libvirt.syms
@@ -818,8 +818,8 @@ noinst_LTLIBRARIES += libvirt_test.la
# Remove version script from convenience library
test_LDFLAGS = \
$$(echo '$(libvirt_la_LDFLAGS)' \
- |sed 's!@VERSION_SCRIPT_FLAGS(a)libvirt.syms!!' \
- |sed 's!-version-info @LIBVIRT_VERSION_INFO@!!')
+ |sed 's!$(VERSION_SCRIPT_FLAGS)libvirt.syms!!' \
+ |sed 's!-version-info $(LIBVIRT_VERSION_INFO)!!')
# Just like the above, but with a slightly different set of public symbols.
libvirt_test_la_SOURCES = $(libvirt_la_SOURCES)
diff --git a/tests/Makefile.am b/tests/Makefile.am
index a20d7ce..584bdb3 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -27,7 +27,7 @@ INCLUDES += \
endif
LDADDS = \
- @STATIC_BINARIES@ \
+ $(STATIC_BINARIES) \
$(LIBXML_LIBS) \
$(GNUTLS_LIBS) \
$(SASL_LIBS) \
--
1.6.6.556.gd6679
14 years, 10 months
[libvirt] Using ESX domain XML for V2V
by Matthew Booth
I'm trying to use the ESX driver to extract metadata from ESX in an
easily digestible form for driving V2V. I've noticed the domain XML
seems to be missing a few bits:
<features/>
<graphics/>
<input/>
<serial/> and <console/> are also missing, but that could well be
because they aren't present.
Is this intentional? Should I be assuming some of the above because it's
ESX, or is this an omission?
Thanks,
Matt
--
Matthew Booth, RHCA, RHCSS
Red Hat Engineering, Virtualisation Team
M: +44 (0)7977 267231
GPG ID: D33C3490
GPG FPR: 3733 612D 2D05 5458 8A8A 1600 3441 EA19 D33C 3490
14 years, 10 months