On 1/30/19 3:31 AM, Pavel Hrdina wrote: > On Tue, Jan 15, 2019 at 08:15:47PM -0500, John Ferlan wrote: >> https://bugzilla.redhat.com/show_bug.cgi?id=1581670 >> >> Introduce the bare bones functions to processing capability >> data for the storage driver. Currently just looking to store >> and format the storage pool types in output, such as: >> >> <pool> >> <type>dir</pool> >> >> <pool> >> <type>fs</pool> >> </pool> >> >> ... >> >> <pool> >> <type>iscsi-direct</pool> >> </pool> > > This looks weird, if you look into output of domcapabilities we use > different formatting to list type values, so how about this: > > <pool> > <enum name='type'> > <value>dir</value> > <value>fs</value> > ... > </enum> > </pool> > > The name of the enum could be 'backend' as well. > > Pavel > This format is fine by me... Keeping enum is fine as well since it follows other examples Do you have any opinions on whether listing the API's supported each pool is a worthwhile effort in any form? Building on the above, the output could be API by API: <pool> <enum name='type'> <value>dir</value> <value>fs</value> ... </enum> <pool_api name='virConnectFindStoragePoolSources'> <value>fs</value> <value>gluster</value> ... </pool_api> ... N pool_api's <vol_api name='virStorageVolUpload'> <value>disk</value> <value>fs</value> ... </vol_api> ... N vol_api's </pool> Tks - John >> >> Signed-off-by: John Ferlan <jferlan@xxxxxxxxxx> >> --- >> src/conf/capabilities.c | 60 ++++++++++++++++++++++++++++++++++++++++ >> src/conf/capabilities.h | 15 ++++++++++ >> src/libvirt_private.syms | 1 + >> 3 files changed, 76 insertions(+) >> >> diff --git a/src/conf/capabilities.c b/src/conf/capabilities.c >> index 1269a4c739..c60743a38d 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" >> @@ -180,6 +181,17 @@ virCapabilitiesFreeGuest(virCapsGuestPtr guest) >> VIR_FREE(guest); >> } >> >> + >> +static void >> +virCapabilitiesFreeStoragePool(virCapsStoragePoolPtr pool) >> +{ >> + if (!pool) >> + return; >> + >> + VIR_FREE(pool); >> +} >> + >> + >> void >> virCapabilitiesFreeNUMAInfo(virCapsPtr caps) >> { >> @@ -221,6 +233,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); >> @@ -792,6 +808,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, >> @@ -1276,6 +1316,24 @@ virCapabilitiesFormatGuestXML(virCapsGuestPtr *guests, >> } >> >> >> +static void >> +virCapabilitiesFormatStoragePoolXML(virCapsStoragePoolPtr *pools, >> + size_t npools, >> + virBufferPtr buf) >> +{ >> + size_t i; >> + >> + for (i = 0; i < npools; i++) { >> + virBufferAddLit(buf, "<pool>\n"); >> + virBufferAdjustIndent(buf, 2); >> + virBufferAsprintf(buf, "<type>%s</pool>\n", >> + virStoragePoolTypeToString(pools[i]->type)); >> + virBufferAdjustIndent(buf, -2); >> + virBufferAddLit(buf, "</pool>\n\n"); >> + } >> +} >> + >> + >> /** >> * virCapabilitiesFormatXML: >> * @caps: capabilities to format >> @@ -1297,6 +1355,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 c3d6306809..9aaa8830e4 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 >> >> -- >> libvir-list mailing list >> libvir-list@xxxxxxxxxx >> https://www.redhat.com/mailman/listinfo/libvir-list -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list