From 3e494a3ca7715176b9b29bd6d538fab1fd9fa592 Mon Sep 17 00:00:00 2001 From: Rhonda D'Vine Date: Wed, 5 Jun 2019 15:30:48 +0200 Subject: [PATCH] Fix #1999: cli: listsnapshot: handle multiple roots and mark orphaned as root This commit addresses the following things: * There can be multiple independent snapshot tree roots, display them all * If a snapshot defines a parent that doesn't exist, it is now considered a snapshot root There is a potential issue (which was also before and also affects the GUI): circular snapshot trees. That plays into the second mentioned issue above. If you manage to have a snapshot that defines a non-existing root in the config, and then create a snapshot with that exact name as a child of that snapshot, it would create a circular dependency. This would have to get addressed in the GUI too. Signed-off-by: Rhonda D'Vine Signed-off-by: Thomas Lamprecht --- PVE/CLI/qm.pm | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/PVE/CLI/qm.pm b/PVE/CLI/qm.pm index 87b97ce0..b5e838e1 100755 --- a/PVE/CLI/qm.pm +++ b/PVE/CLI/qm.pm @@ -926,12 +926,13 @@ our $cmddef = { my $snapshots = { map { $_->{name} => $_ } @$res }; - my $root; + my @roots; foreach my $e (@$res) { - if (my $parent = $e->{parent}) { + my $parent; + if (($parent = $e->{parent}) && defined $snapshots->{$parent}) { push @{$snapshots->{$parent}->{children}}, $e->{name}; } else { - $root = $e->{name}; + push @roots, $e->{name}; } } @@ -967,7 +968,9 @@ our $cmddef = { } }; - $snapshottree->('`->', $root, $snapshots); + foreach my $root (sort $snaptimesort @roots) { + $snapshottree->('`->', $root, $snapshots); + } }], rollback => [ "PVE::API2::Qemu", 'rollback', ['vmid', 'snapname'], { node => $nodename } , $upid_exit ],