lvmplugin: add volume_snapshot_info
and remove public methods: get_snapname_from_path get_snap_volname Signed-off-by: Alexandre Derumier <alexandre.derumier@groupe-cyllene.com>
This commit is contained in:
committed by
Wolfgang Bumiller
parent
f649f5a99c
commit
618b5bc3d8
@ -443,20 +443,6 @@ sub parse_volname {
|
||||
die "unable to parse lvm volume name '$volname'\n";
|
||||
}
|
||||
|
||||
#return snapshot name from a file path
|
||||
sub get_snapname_from_path {
|
||||
my ($class, $volname, $path) = @_;
|
||||
|
||||
my $basepath = basename($path);
|
||||
my $name = ($volname =~ s/\.[^.]+$//r);
|
||||
if ($basepath =~ m/^snap_${name}_(.*)\.qcow2$/) {
|
||||
return $1;
|
||||
} elsif ($basepath eq $volname) {
|
||||
return 'current';
|
||||
}
|
||||
return undef;
|
||||
}
|
||||
|
||||
my sub get_snap_name {
|
||||
my ($class, $volname, $snapname) = @_;
|
||||
|
||||
@ -472,12 +458,6 @@ my sub get_snap_name {
|
||||
}
|
||||
}
|
||||
|
||||
sub get_snap_volname {
|
||||
my ($class, $volname, $snapname) = @_;
|
||||
|
||||
return get_snap_name($class, $volname, $snapname);
|
||||
}
|
||||
|
||||
sub filesystem_path {
|
||||
my ($class, $scfg, $volname, $snapname) = @_;
|
||||
|
||||
@ -787,6 +767,62 @@ sub status {
|
||||
return undef;
|
||||
}
|
||||
|
||||
sub volume_snapshot_info {
|
||||
my ($class, $scfg, $storeid, $volname) = @_;
|
||||
|
||||
my $get_snapname_from_path = sub {
|
||||
my ($volname, $path) = @_;
|
||||
|
||||
my $basepath = basename($path);
|
||||
my $name = ($volname =~ s/\.[^.]+$//r);
|
||||
if ($basepath =~ m/^snap_${name}_(.*)\.qcow2$/) {
|
||||
return $1;
|
||||
} elsif ($basepath eq $volname) {
|
||||
return 'current';
|
||||
}
|
||||
return undef;
|
||||
};
|
||||
|
||||
my $path = $class->filesystem_path($scfg, $volname);
|
||||
my ($vtype, $name, $vmid, $basename, $basevmid, $isBase, $format) =
|
||||
$class->parse_volname($volname);
|
||||
|
||||
my $json = PVE::Storage::Common::qemu_img_info($path, undef, 10, 1);
|
||||
die "failed to query file information with qemu-img\n" if !$json;
|
||||
my $json_decode = eval { decode_json($json) };
|
||||
if ($@) {
|
||||
die "Can't decode qemu snapshot list. Invalid JSON: $@\n";
|
||||
}
|
||||
my $info = {};
|
||||
my $order = 0;
|
||||
return $info if ref($json_decode) ne 'ARRAY';
|
||||
|
||||
#no snapshot or external snapshots is an arrayref
|
||||
my $snapshots = $json_decode;
|
||||
for my $snap (@$snapshots) {
|
||||
my $snapfile = $snap->{filename};
|
||||
my $snapname = $get_snapname_from_path->($volname, $snapfile);
|
||||
#not a proxmox snapshot
|
||||
next if !$snapname;
|
||||
|
||||
my $snapvolname = get_snap_name($class, $volname, $snapname);
|
||||
|
||||
$info->{$snapname}->{order} = $order;
|
||||
$info->{$snapname}->{file} = $snapfile;
|
||||
$info->{$snapname}->{volname} = "$snapvolname";
|
||||
$info->{$snapname}->{volid} = "$storeid:$snapvolname";
|
||||
|
||||
my $parentfile = $snap->{'backing-filename'};
|
||||
if ($parentfile) {
|
||||
my $parentname = $get_snapname_from_path->($volname, $parentfile);
|
||||
$info->{$snapname}->{parent} = $parentname;
|
||||
$info->{$parentname}->{child} = $snapname;
|
||||
}
|
||||
$order++;
|
||||
}
|
||||
return $info;
|
||||
}
|
||||
|
||||
sub activate_storage {
|
||||
my ($class, $storeid, $scfg, $cache) = @_;
|
||||
|
||||
|
||||
@ -1718,17 +1718,15 @@ sub status {
|
||||
return ($res->{total}, $res->{avail}, $res->{used}, 1);
|
||||
}
|
||||
|
||||
sub get_snap_volname {
|
||||
my ($class, $volname, $snapname) = @_;
|
||||
# Returns a hash with the snapshot names as keys and the following data:
|
||||
# id - Unique id to distinguish different snapshots even if the have the same name.
|
||||
# timestamp - Creation time of the snapshot (seconds since epoch).
|
||||
# Returns an empty hash if the volume does not exist.
|
||||
sub volume_snapshot_info {
|
||||
my ($class, $scfg, $storeid, $volname) = @_;
|
||||
|
||||
my $vmid = ($class->parse_volname($volname))[2];
|
||||
my $name = get_snap_name($class, $volname, $snapname);
|
||||
return "$vmid/$name";
|
||||
}
|
||||
|
||||
#return snapshot name from a file path
|
||||
sub get_snapname_from_path {
|
||||
my ($class, $volname, $path) = @_;
|
||||
my $get_snapname_from_path = sub {
|
||||
my ($volname, $path) = @_;
|
||||
|
||||
my $basepath = basename($path);
|
||||
if ($basepath =~ m/^snap-(.*)-vm(.*)$/) {
|
||||
@ -1737,14 +1735,7 @@ sub get_snapname_from_path {
|
||||
return 'current';
|
||||
}
|
||||
return undef;
|
||||
}
|
||||
|
||||
# Returns a hash with the snapshot names as keys and the following data:
|
||||
# id - Unique id to distinguish different snapshots even if the have the same name.
|
||||
# timestamp - Creation time of the snapshot (seconds since epoch).
|
||||
# Returns an empty hash if the volume does not exist.
|
||||
sub volume_snapshot_info {
|
||||
my ($class, $scfg, $storeid, $volname) = @_;
|
||||
};
|
||||
|
||||
my $path = $class->filesystem_path($scfg, $volname);
|
||||
my ($vtype, $name, $vmid, $basename, $basevmid, $isBase, $format) =
|
||||
@ -1772,11 +1763,13 @@ sub volume_snapshot_info {
|
||||
my $snapshots = $json_decode;
|
||||
for my $snap (@$snapshots) {
|
||||
my $snapfile = $snap->{filename};
|
||||
my $snapname = $class->get_snapname_from_path($volname, $snapfile);
|
||||
my $snapname = $get_snapname_from_path->($volname, $snapfile);
|
||||
#not a proxmox snapshot
|
||||
next if !$snapname;
|
||||
|
||||
my $snapvolname = $class->get_snap_volname($volname, $snapname);
|
||||
my $snapvolname = get_snap_name($class, $volname, $snapname);
|
||||
$snapvolname = "$vmid/$snapvolname";
|
||||
|
||||
$info->{$snapname}->{order} = $order;
|
||||
$info->{$snapname}->{file} = $snapfile;
|
||||
$info->{$snapname}->{volname} = "$snapvolname";
|
||||
@ -1785,7 +1778,7 @@ sub volume_snapshot_info {
|
||||
|
||||
my $parentfile = $snap->{'backing-filename'};
|
||||
if ($parentfile) {
|
||||
my $parentname = $class->get_snapname_from_path($volname, $parentfile);
|
||||
my $parentname = $get_snapname_from_path->($volname, $parentfile);
|
||||
$info->{$snapname}->{parent} = $parentname;
|
||||
$info->{$parentname}->{child} = $snapname;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user