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(a)veillard.com | Rpmfind RPM search engine
http://rpmfind.net/
http://veillard.com/ | virtualization library
http://libvirt.org/