use POSIX;
use PVE::Tools qw(run_command);
use PVE::Storage::ZFSPoolPlugin;
+use PVE::RPCEnvironment;
use base qw(PVE::Storage::ZFSPoolPlugin);
use PVE::Storage::LunCmd::Comstar;
use PVE::Storage::LunCmd::Istgt;
use PVE::Storage::LunCmd::Iet;
+
my @ssh_opts = ('-o', 'BatchMode=yes');
my @ssh_cmd = ('/usr/bin/ssh', @ssh_opts);
my $id_rsa_path = '/etc/pve/priv/zfs';
sub zfs_request {
my ($class, $scfg, $timeout, $method, @params) = @_;
- $timeout = 5 if !$timeout;
+ $timeout = PVE::RPCEnvironment->is_worker() ? 60*60 : 10
+ if !$timeout;
my $msg = '';
# Storage implementation
sub path {
- my ($class, $scfg, $volname) = @_;
+ my ($class, $scfg, $volname, $storeid, $snapname) = @_;
+
+ die "direct access to snapshots not implemented"
+ if defined($snapname);
my ($vtype, $name, $vmid) = $class->parse_volname($volname);
sub clone_image {
my ($class, $scfg, $storeid, $volname, $vmid, $snap) = @_;
- my $name = $class->SUPER::clone_image($scfg, $storeid, $volname, $vmid, $snap);
+ my $name = $class->SUPER::clone_image($scfg, $storeid, $volname, $vmid, $snap);
- my $guid = $class->zfs_create_lu($scfg, $name);
- $class->zfs_add_lun_mapping_entry($scfg, $name, $guid);
+ # get ZFS dataset name from PVE volname
+ my (undef, $clonedname) = $class->parse_volname($name);
+
+ my $guid = $class->zfs_create_lu($scfg, $clonedname);
+ $class->zfs_add_lun_mapping_entry($scfg, $clonedname, $guid);
return $name;
}
die "illegal name '$name' - sould be 'vm-$vmid-*'\n"
if $name && $name !~ m/^vm-$vmid-/;
- my $volname = $class->zfs_find_free_diskname($storeid, $scfg, $vmid) if !$name;
+ my $volname = $name;
+
+ $volname = $class->zfs_find_free_diskname($storeid, $scfg, $vmid, $fmt) if !$volname;
- $class->zfs_create_zvol($scfg, $name, $size);
+ $class->zfs_create_zvol($scfg, $volname, $size);
my $guid = $class->zfs_create_lu($scfg, $volname);
$class->zfs_add_lun_mapping_entry($scfg, $volname, $guid);
return $new_size;
}
+sub volume_snapshot_delete {
+ my ($class, $scfg, $storeid, $volname, $snap, $running) = @_;
+
+ $class->zfs_request($scfg, undef, 'destroy', "$scfg->{pool}/$volname\@$snap");
+}
+
sub volume_snapshot_rollback {
my ($class, $scfg, $storeid, $volname, $snap) = @_;
- # abort rollback if snapshot is not the latest
- my $recentsnap = $class->zfs_get_latest_snapshot($scfg, $volname);
- if ($snap ne $recentsnap) {
- die "cannot rollback, more recent snapshots exist\n";
- }
-
$class->zfs_delete_lu($scfg, $volname);
- $class->zfs_request($class, $scfg, undef, 'rollback', "$scfg->{pool}/$volname\@$snap");
+ $class->zfs_request($scfg, undef, 'rollback', "$scfg->{pool}/$volname\@$snap");
$class->zfs_import_lu($scfg, $volname);
$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) = @_;
return undef;
}
+sub volume_snapshot_list {
+ my ($class, $scfg, $storeid, $volname, $prefix, $ip) = @_;
+ # return an empty array if dataset does not exist.
+ die "Volume_snapshot_list is not implemented for ZFS over iSCSI.\n";
+}
+
sub activate_storage {
my ($class, $storeid, $scfg, $cache) = @_;
+
+ return 1;
+}
+
+sub deactivate_storage {
+ my ($class, $storeid, $scfg, $cache) = @_;
+
+ return 1;
+}
+
+sub activate_volume {
+ my ($class, $storeid, $scfg, $volname, $snapname, $cache) = @_;
+
+ die "unable to activate snapshot from remote zfs storage" if $snapname;
+
+ return 1;
+}
+
+sub deactivate_volume {
+ my ($class, $storeid, $scfg, $volname, $snapname, $cache) = @_;
+
+ die "unable to deactivate snapshot from remote zfs storage" if $snapname;
+
return 1;
}