
On Fri, Oct 07, 2011 at 08:37:05PM -0600, Eric Blake wrote:
Relatively straight-forward filtering.
* src/esx/esx_vi.h (esxVI_GetNumberOfSnapshotTrees) (esxVI_GetSnapshotTreeNames): Add parameter. * src/esx/esx_vi.c (esxVI_GetNumberOfSnapshotTrees) (esxVI_GetSnapshotTreeNames): Allow leaf filtering. * src/esx/esx_driver.c (esxDomainSnapshotNum) (esxDomainSnapshotListNames, esxDomainSnapshotNumChildren) (esxDomainSnapshotListChildrenNames): Pass new flag through. --- src/esx/esx_driver.c | 29 +++++++++++++++++++++-------- src/esx/esx_vi.c | 27 ++++++++++++++++----------- src/esx/esx_vi.h | 4 ++-- 3 files changed, 39 insertions(+), 21 deletions(-)
diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c index bcf2406..f2a8f64 100644 --- a/src/esx/esx_driver.c +++ b/src/esx/esx_driver.c @@ -4359,11 +4359,14 @@ esxDomainSnapshotNum(virDomainPtr domain, unsigned int flags) esxPrivate *priv = domain->conn->privateData; esxVI_VirtualMachineSnapshotTree *rootSnapshotTreeList = NULL; bool recurse; + bool leaves;
virCheckFlags(VIR_DOMAIN_SNAPSHOT_LIST_ROOTS | - VIR_DOMAIN_SNAPSHOT_LIST_METADATA, -1); + VIR_DOMAIN_SNAPSHOT_LIST_METADATA | + VIR_DOMAIN_SNAPSHOT_LIST_LEAVES, -1);
recurse = (flags & VIR_DOMAIN_SNAPSHOT_LIST_ROOTS) == 0; + leaves = (flags & VIR_DOMAIN_SNAPSHOT_LIST_LEAVES) != 0;
if (esxVI_EnsureSession(priv->primary) < 0) { return -1; @@ -4378,7 +4381,8 @@ esxDomainSnapshotNum(virDomainPtr domain, unsigned int flags) return -1; }
- count = esxVI_GetNumberOfSnapshotTrees(rootSnapshotTreeList, recurse); + count = esxVI_GetNumberOfSnapshotTrees(rootSnapshotTreeList, recurse, + leaves);
esxVI_VirtualMachineSnapshotTree_Free(&rootSnapshotTreeList);
@@ -4395,11 +4399,14 @@ esxDomainSnapshotListNames(virDomainPtr domain, char **names, int nameslen, esxPrivate *priv = domain->conn->privateData; esxVI_VirtualMachineSnapshotTree *rootSnapshotTreeList = NULL; bool recurse; + bool leaves;
virCheckFlags(VIR_DOMAIN_SNAPSHOT_LIST_ROOTS | - VIR_DOMAIN_SNAPSHOT_LIST_METADATA, -1); + VIR_DOMAIN_SNAPSHOT_LIST_METADATA | + VIR_DOMAIN_SNAPSHOT_LIST_LEAVES, -1);
recurse = (flags & VIR_DOMAIN_SNAPSHOT_LIST_ROOTS) == 0; + leaves = (flags & VIR_DOMAIN_SNAPSHOT_LIST_LEAVES) != 0;
if (names == NULL || nameslen < 0) { ESX_ERROR(VIR_ERR_INVALID_ARG, "%s", _("Invalid argument")); @@ -4420,7 +4427,7 @@ esxDomainSnapshotListNames(virDomainPtr domain, char **names, int nameslen, }
result = esxVI_GetSnapshotTreeNames(rootSnapshotTreeList, names, nameslen, - recurse); + recurse, leaves);
esxVI_VirtualMachineSnapshotTree_Free(&rootSnapshotTreeList);
@@ -4437,11 +4444,14 @@ esxDomainSnapshotNumChildren(virDomainSnapshotPtr snapshot, unsigned int flags) esxVI_VirtualMachineSnapshotTree *rootSnapshotTreeList = NULL; esxVI_VirtualMachineSnapshotTree *snapshotTree = NULL; bool recurse; + bool leaves;
virCheckFlags(VIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS | - VIR_DOMAIN_SNAPSHOT_LIST_METADATA, -1); + VIR_DOMAIN_SNAPSHOT_LIST_METADATA | + VIR_DOMAIN_SNAPSHOT_LIST_LEAVES, -1);
recurse = (flags & VIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS) != 0; + leaves = (flags & VIR_DOMAIN_SNAPSHOT_LIST_LEAVES) != 0;
if (esxVI_EnsureSession(priv->primary) < 0) { return -1; @@ -4462,7 +4472,7 @@ esxDomainSnapshotNumChildren(virDomainSnapshotPtr snapshot, unsigned int flags) }
count = esxVI_GetNumberOfSnapshotTrees(snapshotTree->childSnapshotList, - recurse); + recurse, leaves);
cleanup: esxVI_VirtualMachineSnapshotTree_Free(&rootSnapshotTreeList); @@ -4482,11 +4492,14 @@ esxDomainSnapshotListChildrenNames(virDomainSnapshotPtr snapshot, esxVI_VirtualMachineSnapshotTree *rootSnapshotTreeList = NULL; esxVI_VirtualMachineSnapshotTree *snapshotTree = NULL; bool recurse; + bool leaves;
virCheckFlags(VIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS | - VIR_DOMAIN_SNAPSHOT_LIST_METADATA, -1); + VIR_DOMAIN_SNAPSHOT_LIST_METADATA | + VIR_DOMAIN_SNAPSHOT_LIST_LEAVES, -1);
recurse = (flags & VIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS) != 0; + leaves = (flags & VIR_DOMAIN_SNAPSHOT_LIST_LEAVES) != 0;
if (names == NULL || nameslen < 0) { ESX_ERROR(VIR_ERR_INVALID_ARG, "%s", _("Invalid argument")); @@ -4516,7 +4529,7 @@ esxDomainSnapshotListChildrenNames(virDomainSnapshotPtr snapshot, }
result = esxVI_GetSnapshotTreeNames(snapshotTree->childSnapshotList, - names, nameslen, recurse); + names, nameslen, recurse, leaves);
cleanup: esxVI_VirtualMachineSnapshotTree_Free(&rootSnapshotTreeList); diff --git a/src/esx/esx_vi.c b/src/esx/esx_vi.c index 4a8c709..55a388a 100644 --- a/src/esx/esx_vi.c +++ b/src/esx/esx_vi.c @@ -2164,17 +2164,19 @@ esxVI_GetVirtualMachineIdentity(esxVI_ObjectContent *virtualMachine,
int esxVI_GetNumberOfSnapshotTrees - (esxVI_VirtualMachineSnapshotTree *snapshotTreeList, bool recurse) + (esxVI_VirtualMachineSnapshotTree *snapshotTreeList, bool recurse, + bool leaves) { int count = 0; esxVI_VirtualMachineSnapshotTree *snapshotTree;
for (snapshotTree = snapshotTreeList; snapshotTree != NULL; snapshotTree = snapshotTree->_next) { - count++; + if (!(leaves && snapshotTree->childSnapshotList)) + count++; if (recurse) count += esxVI_GetNumberOfSnapshotTrees - (snapshotTree->childSnapshotList, true); + (snapshotTree->childSnapshotList, true, leaves); }
return count; @@ -2184,7 +2186,8 @@ esxVI_GetNumberOfSnapshotTrees
int esxVI_GetSnapshotTreeNames(esxVI_VirtualMachineSnapshotTree *snapshotTreeList, - char **names, int nameslen, bool recurse) + char **names, int nameslen, bool recurse, + bool leaves) { int count = 0; int result; @@ -2194,14 +2197,16 @@ esxVI_GetSnapshotTreeNames(esxVI_VirtualMachineSnapshotTree *snapshotTreeList, for (snapshotTree = snapshotTreeList; snapshotTree != NULL && count < nameslen; snapshotTree = snapshotTree->_next) { - names[count] = strdup(snapshotTree->name); + if (!(leaves && snapshotTree->childSnapshotList)) { + names[count] = strdup(snapshotTree->name);
- if (names[count] == NULL) { - virReportOOMError(); - goto failure; - } + if (names[count] == NULL) { + virReportOOMError(); + goto failure; + }
- count++; + count++; + }
if (count >= nameslen) { break; @@ -2211,7 +2216,7 @@ esxVI_GetSnapshotTreeNames(esxVI_VirtualMachineSnapshotTree *snapshotTreeList, result = esxVI_GetSnapshotTreeNames(snapshotTree->childSnapshotList, names + count, nameslen - count, - true); + true, leaves);
if (result < 0) { goto failure; diff --git a/src/esx/esx_vi.h b/src/esx/esx_vi.h index 05ed3d0..b8e921f 100644 --- a/src/esx/esx_vi.h +++ b/src/esx/esx_vi.h @@ -359,11 +359,11 @@ int esxVI_GetVirtualMachineIdentity(esxVI_ObjectContent *virtualMachine,
int esxVI_GetNumberOfSnapshotTrees (esxVI_VirtualMachineSnapshotTree *snapshotTreeList, - bool recurse); + bool recurse, bool leaves);
int esxVI_GetSnapshotTreeNames (esxVI_VirtualMachineSnapshotTree *snapshotTreeList, char **names, - int nameslen, bool recurse); + int nameslen, bool recurse, bool leaves);
int esxVI_GetSnapshotTreeByName (esxVI_VirtualMachineSnapshotTree *snapshotTreeList, const char *name,
ACK looks fine but it may be better if Matthias could have a look :-) Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@veillard.com | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/