[pve-devel] [PATCH 2/3] add iscsidirect plugin
Alexandre Derumier
aderumier at odiso.com
Sat Jul 14 15:53:56 CEST 2012
This use libiscsi
storage definition:
------------------
portal 192.168.0.1
target iqn.1986-03.com.sun:....
Signed-off-by: Alexandre Derumier <aderumier at odiso.com>
---
PVE/Storage/ISCSIDirectPlugin.pm | 189 ++++++++++++++++++++++++++++++++++++++
PVE/Storage/Makefile | 2 +-
PVE/Storage/Plugin.pm | 2 +-
3 files changed, 191 insertions(+), 2 deletions(-)
create mode 100644 PVE/Storage/ISCSIDirectPlugin.pm
diff --git a/PVE/Storage/ISCSIDirectPlugin.pm b/PVE/Storage/ISCSIDirectPlugin.pm
new file mode 100644
index 0000000..82b7521
--- /dev/null
+++ b/PVE/Storage/ISCSIDirectPlugin.pm
@@ -0,0 +1,189 @@
+package PVE::Storage::ISCSIDirectPlugin;
+
+use strict;
+use warnings;
+use IO::File;
+use HTTP::Request;
+use LWP::UserAgent;
+use PVE::Tools qw(run_command file_read_firstline trim dir_glob_regex dir_glob_foreach);
+use PVE::Storage::Plugin;
+use PVE::JSONSchema qw(get_standard_option);
+
+use base qw(PVE::Storage::Plugin);
+
+
+sub iscsi_ls{
+ my ($scfg, $storeid) = @_;
+
+
+ my $portal = $scfg->{portal};
+ my $cmd = ['/usr/bin/iscsi-ls', '-s', 'iscsi://'.$portal ];
+ my $list = {};
+ my $test = "";
+
+ my $errfunc = sub {
+ my $line = shift;
+ $line = trim($line);
+
+ die $line if $line;
+ };
+
+ eval {
+
+ run_command($cmd, errmsg => "iscsi error", errfunc => $errfunc,outfunc => sub {
+ my $line = shift;
+ $line = trim($line);
+ if( $line =~ /Lun:(\d+)\s+([A-Za-z0-9\-\_\.\:]*)\s+\(Size:(\d+)G\)/ ) {
+ $test = $1;
+
+ my $image = $1;
+ my $size = $3;
+
+ $list->{$storeid}->{$image} = {
+ name => $image,
+ size => $size,
+ };
+ }
+ });
+ };
+
+ my $err = $@;
+ die $err if $err && $err !~ m/TESTUNITREADY failed with SENSE KEY/ ;
+ return $list;
+
+}
+
+# Configuration
+
+sub type {
+ return 'iscsidirect';
+}
+
+sub plugindata {
+ return {
+ content => [ {images => 1, none => 1}, { images => 1 }],
+ };
+}
+
+sub options {
+ return {
+ portal => { fixed => 1 },
+ target => { fixed => 1 },
+ nodes => { optional => 1},
+ disable => { optional => 1},
+ content => { optional => 1},
+ };
+}
+
+
+# Storage implementation
+
+sub parse_volname {
+ my ($class, $volname) = @_;
+
+
+ if ($volname =~ m/^(\d+)$/) {
+ return ('images', $1, undef);
+ }
+
+ die "unable to parse iscsi volume name '$volname'\n";
+
+}
+
+sub path {
+ my ($class, $scfg, $volname) = @_;
+
+ my ($vtype, $lun, $vmid) = $class->parse_volname($volname);
+
+ my $target = $scfg->{target};
+ my $portal = $scfg->{portal};
+
+ my $path = "iscsi://$portal/$target/$lun";
+
+ return ($path, $vmid, $vtype);
+}
+
+
+sub alloc_image {
+ my ($class, $storeid, $scfg, $vmid, $fmt, $name, $size) = @_;
+
+ die "can't allocate space in iscsi storage\n";
+}
+
+sub free_image {
+ my ($class, $storeid, $scfg, $volname) = @_;
+
+ die "can't free space in iscsi storage\n";
+}
+
+
+sub list_images {
+ my ($class, $storeid, $scfg, $vmid, $vollist, $cache) = @_;
+
+ my $res = [];
+
+ $cache->{directiscsi} = iscsi_ls($scfg,$storeid) if !$cache->{directiscsi};
+
+ # we have no owner for iscsi devices
+
+ my $target = $scfg->{target};
+
+ if (my $dat = $cache->{directiscsi}->{$storeid}) {
+
+ foreach my $volname (keys %$dat) {
+
+ my $volid = "$storeid:$volname";
+
+ if ($vollist) {
+ my $found = grep { $_ eq $volid } @$vollist;
+ next if !$found;
+ } else {
+ # we have no owner for iscsi devices
+ next if defined($vmid);
+ }
+
+ my $info = $dat->{$volname};
+ $info->{volid} = $volid;
+
+ push @$res, $info;
+ }
+ }
+
+ return $res;
+}
+
+
+sub status {
+ my ($class, $storeid, $scfg, $cache) = @_;
+
+ my $total = 0;
+ my $free = 0;
+ my $used = 0;
+ my $active = 1;
+ return ($total,$free,$used,$active);
+
+ return undef;
+}
+
+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, $exclusive, $cache) = @_;
+ return 1;
+}
+
+sub deactivate_volume {
+ my ($class, $storeid, $scfg, $volname, $exclusive, $cache) = @_;
+ return 1;
+}
+
+
+1;
diff --git a/PVE/Storage/Makefile b/PVE/Storage/Makefile
index e13890f..407f55c 100644
--- a/PVE/Storage/Makefile
+++ b/PVE/Storage/Makefile
@@ -1,4 +1,4 @@
-SOURCES=Plugin.pm DirPlugin.pm LVMPlugin.pm NFSPlugin.pm ISCSIPlugin.pm RBDPlugin.pm SheepdogPlugin.pm
+SOURCES=Plugin.pm DirPlugin.pm LVMPlugin.pm NFSPlugin.pm ISCSIPlugin.pm RBDPlugin.pm SheepdogPlugin.pm ISCSIDirectPlugin.pm
.PHONY: install
install:
diff --git a/PVE/Storage/Plugin.pm b/PVE/Storage/Plugin.pm
index df994d5..2c21a4d 100644
--- a/PVE/Storage/Plugin.pm
+++ b/PVE/Storage/Plugin.pm
@@ -300,7 +300,7 @@ sub parse_config {
$d->{content} = $def->{content}->[1] if !$d->{content};
}
- if ($type eq 'iscsi' || $type eq 'nfs' || $type eq 'rbd' || $type eq 'sheepdog' ) {
+ if ($type eq 'iscsi' || $type eq 'nfs' || $type eq 'rbd' || $type eq 'sheepdog' || $type eq 'iscsidirect' ) {
$d->{shared} = 1;
}
}
--
1.7.2.5
More information about the pve-devel
mailing list