Introduce the bare bones functions to processing capability
data for the storage driver.
Since there will be no need for the <host> output, we need
to filter that data.
Signed-off-by: John Ferlan <jferlan(a)redhat.com>
---
src/conf/capabilities.c | 74 ++++++++++++++++++++++++++++++++++++++++
src/conf/capabilities.h | 15 ++++++++
src/libvirt_private.syms | 1 +
3 files changed, 90 insertions(+)
diff --git a/src/conf/capabilities.c b/src/conf/capabilities.c
index 716ac6e2e7..47308700bb 100644
--- a/src/conf/capabilities.c
+++ b/src/conf/capabilities.c
@@ -28,6 +28,7 @@
#include "cpu_conf.h"
#include "domain_conf.h"
#include "physmem.h"
+#include "storage_conf.h"
#include "viralloc.h"
#include "virarch.h"
#include "virbuffer.h"
@@ -181,6 +182,17 @@ virCapabilitiesFreeGuest(virCapsGuestPtr guest)
VIR_FREE(guest);
}
+
+static void
+virCapabilitiesFreeStoragePool(virCapsStoragePoolPtr pool)
+{
+ if (!pool)
+ return;
+
+ VIR_FREE(pool);
+}
+
+
void
virCapabilitiesFreeNUMAInfo(virCapsPtr caps)
{
@@ -222,6 +234,10 @@ virCapsDispose(void *object)
virCapsPtr caps = object;
size_t i;
+ for (i = 0; i < caps->npools; i++)
+ virCapabilitiesFreeStoragePool(caps->pools[i]);
+ VIR_FREE(caps->pools);
+
for (i = 0; i < caps->nguests; i++)
virCapabilitiesFreeGuest(caps->guests[i]);
VIR_FREE(caps->guests);
@@ -793,6 +809,30 @@ virCapabilitiesDomainDataLookup(virCapsPtr caps,
emulator, machinetype);
}
+
+int
+virCapabilitiesAddStoragePool(virCapsPtr caps,
+ int poolType)
+{
+ virCapsStoragePoolPtr pool;
+
+ if (VIR_ALLOC(pool) < 0)
+ goto error;
+
+ pool->type = poolType;
+
+ if (VIR_RESIZE_N(caps->pools, caps->npools_max, caps->npools, 1) < 0)
+ goto error;
+ caps->pools[caps->npools++] = pool;
+
+ return 0;
+
+ error:
+ virCapabilitiesFreeStoragePool(pool);
+ return -1;
+}
+
+
static int
virCapabilitiesFormatNUMATopology(virBufferPtr buf,
size_t ncells,
@@ -1065,6 +1105,12 @@ virCapabilitiesFormatHostXML(virCapsHostPtr host,
size_t i, j;
char host_uuid[VIR_UUID_STRING_BUFLEN];
+ /* The lack of some data means we have nothing
+ * minimally to format, so just return. */
+ if (!virUUIDIsValid(host->host_uuid) &&
+ !host->arch && !host->powerMgmt && !host->iommu)
+ return 0;
+
virBufferAddLit(buf, "<host>\n");
virBufferAdjustIndent(buf, 2);
if (virUUIDIsValid(host->host_uuid)) {
@@ -1277,6 +1323,32 @@ virCapabilitiesFormatGuestXML(virCapsGuestPtr *guests,
}
+static void
+virCapabilitiesFormatStoragePoolXML(virCapsStoragePoolPtr *pools,
+ size_t npools,
+ virBufferPtr buf)
+{
+ size_t i;
+
+ if (npools == 0)
+ return;
+
+ virBufferAddLit(buf, "<pool>\n");
+ virBufferAdjustIndent(buf, 2);
+
+ virBufferAddLit(buf, "<enum name='type'>\n");
+ virBufferAdjustIndent(buf, 2);
+ for (i = 0; i < npools; i++)
+ virBufferAsprintf(buf, "<value>%s</value>\n",
+ virStoragePoolTypeToString(pools[i]->type));
+ virBufferAdjustIndent(buf, -2);
+ virBufferAddLit(buf, "</enum>\n");
+
+ virBufferAdjustIndent(buf, -2);
+ virBufferAddLit(buf, "</pool>\n\n");
+}
+
+
/**
* virCapabilitiesFormatXML:
* @caps: capabilities to format
@@ -1298,6 +1370,8 @@ virCapabilitiesFormatXML(virCapsPtr caps)
virCapabilitiesFormatGuestXML(caps->guests, caps->nguests, &buf);
+ virCapabilitiesFormatStoragePoolXML(caps->pools, caps->npools, &buf);
+
virBufferAdjustIndent(&buf, -2);
virBufferAddLit(&buf, "</capabilities>\n");
diff --git a/src/conf/capabilities.h b/src/conf/capabilities.h
index 31c2a07a9b..cca1a20949 100644
--- a/src/conf/capabilities.h
+++ b/src/conf/capabilities.h
@@ -211,6 +211,13 @@ struct _virCapsHost {
bool iommu;
};
+typedef struct _virCapsStoragePool virCapsStoragePool;
+typedef virCapsStoragePool *virCapsStoragePoolPtr;
+struct _virCapsStoragePool {
+ int type;
+};
+
+
typedef int (*virDomainDefNamespaceParse)(xmlDocPtr, xmlNodePtr,
xmlXPathContextPtr, void **);
typedef void (*virDomainDefNamespaceFree)(void *);
@@ -235,6 +242,10 @@ struct _virCaps {
size_t nguests;
size_t nguests_max;
virCapsGuestPtr *guests;
+
+ size_t npools;
+ size_t npools_max;
+ virCapsStoragePoolPtr *pools;
};
typedef struct _virCapsDomainData virCapsDomainData;
@@ -318,6 +329,10 @@ virCapabilitiesAddGuestFeature(virCapsGuestPtr guest,
bool defaultOn,
bool toggle);
+int
+virCapabilitiesAddStoragePool(virCapsPtr caps,
+ int poolType);
+
int
virCapabilitiesHostSecModelAddBaseLabel(virCapsHostSecModelPtr secmodel,
const char *type,
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 67579742fd..62e37f442d 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -49,6 +49,7 @@ virCapabilitiesAddGuestFeature;
virCapabilitiesAddHostFeature;
virCapabilitiesAddHostMigrateTransport;
virCapabilitiesAddHostNUMACell;
+virCapabilitiesAddStoragePool;
virCapabilitiesAllocMachines;
virCapabilitiesClearHostNUMACellCPUTopology;
virCapabilitiesDomainDataLookup;
--
2.20.1