Include new storage function volume_send.
If the storage backend support import and export we can send the contend to a remote host.
This commit is contained in:
committed by
Wolfgang Bumiller
parent
d412b98df8
commit
b76774e57f
@ -216,6 +216,24 @@ sub volume_snapshot {
|
||||
}
|
||||
}
|
||||
|
||||
sub volume_send {
|
||||
my ($cfg, $volid, $snap, $ip, $incremental_snap, $verbose, $limit,
|
||||
$target_path) = @_;
|
||||
|
||||
my ($storeid, $volname) = parse_volume_id($volid, 1);
|
||||
if ($storeid) {
|
||||
my $scfg = storage_config($cfg, $storeid);
|
||||
my $plugin = PVE::Storage::Plugin->lookup($scfg->{type});
|
||||
return $plugin->volume_send($scfg, $storeid, $volname, $ip, $snap,
|
||||
$incremental_snap, $verbose, $limit, $target_path);
|
||||
|
||||
} elsif ($volid =~ m|^(/.+)$| && -e $volid) {
|
||||
die "send file/device '$volid' is not possible\n";
|
||||
} else {
|
||||
die "unable to parse volume ID '$volid'\n";
|
||||
}
|
||||
}
|
||||
|
||||
sub volume_snapshot_rollback {
|
||||
my ($cfg, $volid, $snap) = @_;
|
||||
|
||||
|
||||
@ -697,6 +697,14 @@ sub volume_snapshot {
|
||||
return undef;
|
||||
}
|
||||
|
||||
sub volume_send {
|
||||
my ($class, $scfg, $storeid, $volname, $ip, $snap,
|
||||
$incremental_snap, $verbose, $limit, $target_path) = @_;
|
||||
|
||||
# implement in subclass
|
||||
die "Volume_send is not implemented for $class";
|
||||
}
|
||||
|
||||
sub volume_rollback_is_possible {
|
||||
my ($class, $scfg, $storeid, $volname, $snap) = @_;
|
||||
|
||||
|
||||
@ -336,6 +336,13 @@ sub volume_snapshot_rollback {
|
||||
$class->zfs_add_lun_mapping_entry($scfg, $volname);
|
||||
}
|
||||
|
||||
sub volume_send {
|
||||
my ($class, $scfg, $storeid, $volname, $ip, $snap,
|
||||
$incremental_snap, $verbose, $limit, $target_path) = @_;
|
||||
|
||||
die "Volume_send is not implemented for ZFS over iSCSI.\n";
|
||||
}
|
||||
|
||||
sub volume_has_feature {
|
||||
my ($class, $scfg, $feature, $storeid, $volname, $snapname, $running) = @_;
|
||||
|
||||
|
||||
@ -465,6 +465,54 @@ sub volume_snapshot {
|
||||
$class->zfs_request($scfg, undef, 'snapshot', "$scfg->{pool}/$vname\@$snap");
|
||||
}
|
||||
|
||||
sub volume_send {
|
||||
my ($class, $scfg, $storeid, $volname, $ip, $snap,
|
||||
$incremental_snap, $verbose, $limit, $target_path) = @_;
|
||||
|
||||
my ($vtype, $name, $vmid) = $class->parse_volname($volname);
|
||||
|
||||
my $zpath = "$scfg->{pool}/$name";
|
||||
|
||||
die "$vtype is not allowed in ZFSPool!" if ($vtype ne "images");
|
||||
|
||||
my $cmdsend = [];
|
||||
my $cmdlimit = [];
|
||||
|
||||
push @$cmdsend, 'zfs', 'send', '-R';
|
||||
push @$cmdsend, '-v' if defined($verbose);
|
||||
|
||||
if( defined($incremental_snap)) {
|
||||
push @$cmdsend, '-I', "$zpath\@${incremental_snap}";
|
||||
}
|
||||
|
||||
push @$cmdsend, '--', "$zpath\@${snap}";
|
||||
|
||||
# limit in kByte/s
|
||||
if ($limit){
|
||||
my $bwl = $limit * 1024;
|
||||
push @$cmdlimit, 'cstream', '-t', $bwl;
|
||||
}
|
||||
|
||||
my $cmdrecv = [];
|
||||
|
||||
push @$cmdrecv, 'ssh', '-o', 'BatchMode=yes', "root\@${ip}", '--' if $ip;
|
||||
push @$cmdrecv, 'zfs', 'recv', '-F', '--';
|
||||
|
||||
$zpath = $target_path if defined($target_path);
|
||||
push @$cmdrecv, $zpath;
|
||||
|
||||
|
||||
if ($limit) {
|
||||
eval { run_command([$cmdsend, $cmdlimit, $cmdrecv]) };
|
||||
} else {
|
||||
eval { run_command([$cmdsend, $cmdrecv]) };
|
||||
}
|
||||
|
||||
if (my $err = $@) {
|
||||
die $err;
|
||||
}
|
||||
}
|
||||
|
||||
sub volume_snapshot_delete {
|
||||
my ($class, $scfg, $storeid, $volname, $snap, $running) = @_;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user