[pve-devel] [PATCH 1/2] Add Multipath direct storage plugin and enable it.

Dmitry Petuhov mityapetuhov at gmail.com
Thu Jun 30 12:21:28 CEST 2016


Signed-off-by: Dmitry Petuhov <mityapetuhov at gmail.com>
---
 PVE/Storage.pm                |   2 +
 PVE/Storage/MPDirectPlugin.pm | 208 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 210 insertions(+)
 create mode 100644 PVE/Storage/MPDirectPlugin.pm

diff --git a/PVE/Storage.pm b/PVE/Storage.pm
index 011c4f3..ddf9ffe 100755
--- a/PVE/Storage.pm
+++ b/PVE/Storage.pm
@@ -32,6 +32,7 @@ use PVE::Storage::GlusterfsPlugin;
 use PVE::Storage::ZFSPoolPlugin;
 use PVE::Storage::ZFSPlugin;
 use PVE::Storage::DRBDPlugin;
+use PVE::Storage::MPDirectPlugin;
 
 # load and initialize all plugins
 PVE::Storage::DirPlugin->register();
@@ -46,6 +47,7 @@ PVE::Storage::GlusterfsPlugin->register();
 PVE::Storage::ZFSPoolPlugin->register();
 PVE::Storage::ZFSPlugin->register();
 PVE::Storage::DRBDPlugin->register();
+PVE::Storage::MPDirectPlugin->register();
 PVE::Storage::Plugin->init();
 
 my $UDEVADM = '/sbin/udevadm';
diff --git a/PVE/Storage/MPDirectPlugin.pm b/PVE/Storage/MPDirectPlugin.pm
new file mode 100644
index 0000000..76ced94
--- /dev/null
+++ b/PVE/Storage/MPDirectPlugin.pm
@@ -0,0 +1,208 @@
+package PVE::Storage::MPDirectPlugin;
+
+use strict;
+use warnings;
+use Data::Dumper;
+use IO::File;
+use PVE::Tools qw(run_command trim);
+use PVE::Storage::Plugin;
+use PVE::JSONSchema qw(get_standard_option);
+
+use base qw(PVE::Storage::Plugin);
+
+# Configuration
+
+sub type {
+    return 'mpdirect';
+}
+
+sub plugindata {
+    return {
+	content => [ {images => 1, rootdir => 1, none => 1}, { images => 1 }],
+    };
+}
+
+sub properties {
+    return {
+    };
+}
+
+sub options {
+    return {
+	content => { optional => 1 },
+    };
+}
+
+# Storage implementation
+
+sub parse_volname {
+    my ($class, $volname) = @_;
+
+    return ('images', $volname, undef, undef, undef, undef, 'raw');
+}
+
+sub filesystem_path {
+    my ($class, $scfg, $volname, $snapname) = @_;
+
+    die "Direct attached device snapshot is not implemented" if defined($snapname);
+
+    my ($vtype, $name, $vmid) = $class->parse_volname($volname);
+
+    my $path = "/dev/disk/by-id/wwn-0x$name";
+
+    return wantarray ? ($path, $vmid, $vtype) : $path;
+}
+
+sub create_base {
+    my ($class, $storeid, $scfg, $volname) = @_;
+
+    die "Cannot create physical device";
+}
+
+sub clone_image {
+    my ($class, $scfg, $storeid, $volname, $vmid, $snap) = @_;
+
+    die "Cannot create physical device";
+}
+
+sub alloc_image {
+    my ($class, $storeid, $scfg, $vmid, $fmt, $name, $size) = @_;
+
+    die "Cannot create physical device";
+}
+
+sub free_image {
+    my ($class, $storeid, $scfg, $volname, $isBase) = @_;
+
+    die "Cannot create physical device";
+}
+
+sub list_images {
+    my ($class, $storeid, $scfg, $vmid, $vollist, $cache) = @_;
+
+    my $vgname = $scfg->{vgname};
+
+    my $res = [];
+
+    opendir my $dir, '/dev/disk/by-id' || die "Cannot list disks";
+
+    while (my $disk = readdir $dir) {
+	# We don't want partitions here
+	next if $disk =~ m/-part\d+$/;
+
+	next if $disk !~ m/^wwn-0x(.+)$/;
+	my $wwid = $1;
+
+	my $volid = "$storeid:$wwid";
+
+	if ($vollist) {
+	    my $found = grep { $_ eq $volid } @$vollist;
+	    next if !$found;
+	} else {
+	    next if defined($vmid);
+	}
+
+	my $actualdev = readlink "/dev/disk/by-id/$disk";
+	$actualdev =~ s/..\/..\///;
+
+	my $size;
+	if (open SZ, "/sys/block/$actualdev/size" ) {
+	    $size = <SZ>;
+	    $size *= 512;
+	    close SZ;
+	} else {
+	    $size = undef;
+	}
+
+	push @$res, {
+	    volid => $volid, format => 'raw', size => $size,
+	};
+    }
+    closedir $dir;
+
+    return $res;
+}
+
+sub status {
+    my ($class, $storeid, $scfg, $cache) = @_;
+
+    # We cannot know status of undefined set of devices
+    return undef;
+}
+
+sub activate_storage {
+    my ($class, $storeid, $scfg, $cache) = @_;
+
+    # Server's SCSI subsystem is always up, so there's nothing to do
+    # Maybe we could control selected controllers/ports in future.
+    return 1;
+}
+
+sub deactivate_storage {
+    my ($class, $storeid, $scfg, $cache) = @_;
+
+    return 1;
+}
+
+sub activate_volume {
+    my ($class, $storeid, $scfg, $volname, $snapname, $cache) = @_;
+
+    die "volume snapshot is not possible on direct-attached storage device" if $snapname;
+
+    return 1;
+}
+
+sub deactivate_volume {
+    my ($class, $storeid, $scfg, $volname, $snapname, $cache) = @_;
+
+    die "volume snapshot is not possible on direct-attached storage  device" if $snapname;
+
+    return 1;
+}
+
+sub volume_resize {
+    my ($class, $scfg, $storeid, $volname, $size, $running) = @_;
+
+    die "Direct-attached storage device cannot be resized";
+}
+
+sub volume_snapshot {
+    my ($class, $scfg, $storeid, $volname, $snap) = @_;
+
+    die "Direct-attached storage snapshot is not implemented";
+}
+
+sub volume_snapshot_rollback {
+    my ($class, $scfg, $storeid, $volname, $snap) = @_;
+
+    die "Direct-attached storage snapshot rollback is not implemented";
+}
+
+sub volume_snapshot_delete {
+    my ($class, $scfg, $storeid, $volname, $snap) = @_;
+
+    die "Direct-attached storage snapshot delete is not implemented";
+}
+
+sub volume_has_feature {
+    my ($class, $scfg, $feature, $storeid, $volname, $snapname, $running) = @_;
+
+    my $features = {
+	copy => { base => 1, current => 1},
+    };
+
+    my ($vtype, $name, $vmid, $basename, $basevmid, $isBase) =
+	$class->parse_volname($volname);
+
+    my $key = undef;
+    if($snapname){
+	$key = 'snap';
+    }else{
+	$key =  $isBase ? 'base' : 'current';
+    }
+    return 1 if $features->{$feature}->{$key};
+
+    return undef;
+}
+
+1;
-- 
2.1.4




More information about the pve-devel mailing list