}
}
-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) = @_;
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) = @_;
$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) = @_;
$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 = [];
-
- if ($ip) {
- $ip = "[$ip]" if Net::IP::ip_is_ipv6($ip);
- push @$cmdrecv, 'ssh', '-o', 'BatchMode=yes', "root\@${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) = @_;