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 <rhonda@proxmox.com>
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
This commit is contained in:
Rhonda D'Vine 2019-06-05 15:30:48 +02:00 committed by Thomas Lamprecht
parent 90041ba890
commit 3e494a3ca7

View File

@ -926,12 +926,13 @@ our $cmddef = {
my $snapshots = { map { $_->{name} => $_ } @$res }; my $snapshots = { map { $_->{name} => $_ } @$res };
my $root; my @roots;
foreach my $e (@$res) { foreach my $e (@$res) {
if (my $parent = $e->{parent}) { my $parent;
if (($parent = $e->{parent}) && defined $snapshots->{$parent}) {
push @{$snapshots->{$parent}->{children}}, $e->{name}; push @{$snapshots->{$parent}->{children}}, $e->{name};
} else { } 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 ], rollback => [ "PVE::API2::Qemu", 'rollback', ['vmid', 'snapname'], { node => $nodename } , $upid_exit ],