Commit 9f5e53e introduced the ability to filter snapshots to
just roots, but it was never implemented for ESX until now.
* src/esx/esx_vi.h (esxVI_GetNumberOfSnapshotTrees)
(esxVI_GetSnapshotTreeNames): Add parameter.
* src/esx/esx_vi.c (esxVI_GetNumberOfSnapshotTrees)
(esxVI_GetSnapshotTreeNames): Allow choice of recursion or not.
* src/esx/esx_driver.c (esxDomainSnapshotNum)
(esxDomainSnapshotListNames): Use it to limit to roots.
---
src/esx/esx_driver.c | 17 +++++++++++++----
src/esx/esx_vi.c | 26 ++++++++++++++++----------
src/esx/esx_vi.h | 6 ++++--
3 files changed, 33 insertions(+), 16 deletions(-)
diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c
index ab93efd..9718f61 100644
--- a/src/esx/esx_driver.c
+++ b/src/esx/esx_driver.c
@@ -4359,8 +4359,12 @@ esxDomainSnapshotNum(virDomainPtr domain, unsigned int flags)
int count;
esxPrivate *priv = domain->conn->privateData;
esxVI_VirtualMachineSnapshotTree *rootSnapshotTreeList = NULL;
+ bool recurse;
- virCheckFlags(VIR_DOMAIN_SNAPSHOT_LIST_METADATA, -1);
+ virCheckFlags(VIR_DOMAIN_SNAPSHOT_LIST_ROOTS |
+ VIR_DOMAIN_SNAPSHOT_LIST_METADATA, -1);
+
+ recurse = (flags & VIR_DOMAIN_SNAPSHOT_LIST_ROOTS) == 0;
if (esxVI_EnsureSession(priv->primary) < 0) {
return -1;
@@ -4375,7 +4379,7 @@ esxDomainSnapshotNum(virDomainPtr domain, unsigned int flags)
return -1;
}
- count = esxVI_GetNumberOfSnapshotTrees(rootSnapshotTreeList);
+ count = esxVI_GetNumberOfSnapshotTrees(rootSnapshotTreeList, recurse);
esxVI_VirtualMachineSnapshotTree_Free(&rootSnapshotTreeList);
@@ -4391,8 +4395,12 @@ esxDomainSnapshotListNames(virDomainPtr domain, char **names, int
nameslen,
int result;
esxPrivate *priv = domain->conn->privateData;
esxVI_VirtualMachineSnapshotTree *rootSnapshotTreeList = NULL;
+ bool recurse;
+
+ virCheckFlags(VIR_DOMAIN_SNAPSHOT_LIST_ROOTS |
+ VIR_DOMAIN_SNAPSHOT_LIST_METADATA, -1);
- virCheckFlags(VIR_DOMAIN_SNAPSHOT_LIST_METADATA, -1);
+ recurse = (flags & VIR_DOMAIN_SNAPSHOT_LIST_ROOTS) == 0;
if (names == NULL || nameslen < 0) {
ESX_ERROR(VIR_ERR_INVALID_ARG, "%s", _("Invalid argument"));
@@ -4412,7 +4420,8 @@ esxDomainSnapshotListNames(virDomainPtr domain, char **names, int
nameslen,
return -1;
}
- result = esxVI_GetSnapshotTreeNames(rootSnapshotTreeList, names, nameslen);
+ result = esxVI_GetSnapshotTreeNames(rootSnapshotTreeList, names, nameslen,
+ recurse);
esxVI_VirtualMachineSnapshotTree_Free(&rootSnapshotTreeList);
diff --git a/src/esx/esx_vi.c b/src/esx/esx_vi.c
index 2d9890c..fa26dea 100644
--- a/src/esx/esx_vi.c
+++ b/src/esx/esx_vi.c
@@ -2164,15 +2164,17 @@ esxVI_GetVirtualMachineIdentity(esxVI_ObjectContent
*virtualMachine,
int
esxVI_GetNumberOfSnapshotTrees
- (esxVI_VirtualMachineSnapshotTree *snapshotTreeList)
+ (esxVI_VirtualMachineSnapshotTree *snapshotTreeList, bool recurse)
{
int count = 0;
esxVI_VirtualMachineSnapshotTree *snapshotTree;
for (snapshotTree = snapshotTreeList; snapshotTree != NULL;
snapshotTree = snapshotTree->_next) {
- count += 1 + esxVI_GetNumberOfSnapshotTrees
- (snapshotTree->childSnapshotList);
+ count++;
+ if (recurse)
+ count += esxVI_GetNumberOfSnapshotTrees
+ (snapshotTree->childSnapshotList, true);
}
return count;
@@ -2182,7 +2184,7 @@ esxVI_GetNumberOfSnapshotTrees
int
esxVI_GetSnapshotTreeNames(esxVI_VirtualMachineSnapshotTree *snapshotTreeList,
- char **names, int nameslen)
+ char **names, int nameslen, bool recurse)
{
int count = 0;
int result;
@@ -2205,14 +2207,18 @@ esxVI_GetSnapshotTreeNames(esxVI_VirtualMachineSnapshotTree
*snapshotTreeList,
break;
}
- result = esxVI_GetSnapshotTreeNames(snapshotTree->childSnapshotList,
- names + count, nameslen - count);
+ if (recurse) {
+ result = esxVI_GetSnapshotTreeNames(snapshotTree->childSnapshotList,
+ names + count,
+ nameslen - count,
+ true);
- if (result < 0) {
- goto failure;
- }
+ if (result < 0) {
+ goto failure;
+ }
- count += result;
+ count += result;
+ }
}
return count;
diff --git a/src/esx/esx_vi.h b/src/esx/esx_vi.h
index 8677ca0..05ed3d0 100644
--- a/src/esx/esx_vi.h
+++ b/src/esx/esx_vi.h
@@ -2,6 +2,7 @@
/*
* esx_vi.h: client for the VMware VI API 2.5 to manage ESX hosts
*
+ * Copyright (C) 2011 Red Hat, Inc.
* Copyright (C) 2009-2010 Matthias Bolte <matthias.bolte(a)googlemail.com>
*
* This library is free software; you can redistribute it and/or
@@ -357,11 +358,12 @@ int esxVI_GetVirtualMachineIdentity(esxVI_ObjectContent
*virtualMachine,
int *id, char **name, unsigned char *uuid);
int esxVI_GetNumberOfSnapshotTrees
- (esxVI_VirtualMachineSnapshotTree *snapshotTreeList);
+ (esxVI_VirtualMachineSnapshotTree *snapshotTreeList,
+ bool recurse);
int esxVI_GetSnapshotTreeNames
(esxVI_VirtualMachineSnapshotTree *snapshotTreeList, char **names,
- int nameslen);
+ int nameslen, bool recurse);
int esxVI_GetSnapshotTreeByName
(esxVI_VirtualMachineSnapshotTree *snapshotTreeList, const char *name,
--
1.7.4.4