[pve-devel] r5052 - pve-storage/pve2

svn-commits at proxmox.com svn-commits at proxmox.com
Wed Aug 25 14:04:24 CEST 2010


Author: dietmar
Date: 2010-08-25 12:04:24 +0000 (Wed, 25 Aug 2010)
New Revision: 5052

Modified:
   pve-storage/pve2/ChangeLog
   pve-storage/pve2/pvesm
Log:
* pvesm: use new PVE::CLIHandler



Modified: pve-storage/pve2/ChangeLog
===================================================================
--- pve-storage/pve2/ChangeLog	2010-08-25 12:02:59 UTC (rev 5051)
+++ pve-storage/pve2/ChangeLog	2010-08-25 12:04:24 UTC (rev 5052)
@@ -1,5 +1,7 @@
 2010-08-25  Proxmox Support Team  <support at proxmox.com>
 
+	* pvesm: use new PVE::CLIHandler
+
 	* PVE/API2/Storage.pm: create extra upload method, because this
 	have different 'proxy' requirements that normal 'create'
 

Modified: pve-storage/pve2/pvesm
===================================================================
--- pve-storage/pve2/pvesm	2010-08-25 12:02:59 UTC (rev 5051)
+++ pve-storage/pve2/pvesm	2010-08-25 12:04:24 UTC (rev 5052)
@@ -13,8 +13,10 @@
 use PVE::API2::Storage::Status;
 use PVE::API2::Storage::Scan;
 
-use Data::Dumper; # fixme: remove 
+use PVE::CLIHandler;
 
+use base qw(PVE::CLIHandler);
+
 $ENV{'PATH'} = '/sbin:/bin:/usr/sbin:/usr/bin';
 
 die "please run as root\n" if $> != 0;
@@ -27,102 +29,154 @@
 
 $rpcenv->set_user('root'); 
 
-# fixme:
-sub print_usage {
-    my $msg = shift;
+__PACKAGE__->register_method ({
+    name => 'path', 
+    path => 'path',
+    method => 'GET',
+    description => "Get filesystem path for specified volume",
+    parameters => {
+    	additionalProperties => 0,
+	properties => {
+	    volume => {
+		description => "Volume identifier",
+		type => 'string', format => 'pve-volume-id',
+	    },
+	},
+    },
+    returns => { type => 'null' },
+    
+    code => sub {
+	my ($param) = @_;
 
-    print STDERR "ERROR: $msg\n" if $msg;
-    print STDERR "USAGE: pvesm <COMMAND> [OPTIONS]\n";
-}
+	my $cfg = read_file('storagecfg');
 
-if (!scalar (@ARGV)) {
-    print_usage ("no command specified");
-    exit (-1);
-}
+	my $path = PVE::Storage::path ($cfg, $param->{volume});
 
-sub print_content {
-    my ($sid, $list) = @_;
+	print "$path\n";
 
-    my $maxlenname = 0;
-    foreach my $info (@$list) {
+	return undef;
 
-	my $volname = $info->{volname};
-	my $volid = "$sid:$volname";
-	my $sidlen =  length ($volid);
-	$maxlenname = $sidlen if $sidlen > $maxlenname;
-    }
+    }});
 
-    foreach my $info (@$list) {
-	my $volname = $info->{volname};
-	my $volid = "$sid:$volname";
-	next if !$info->{vmid};
+__PACKAGE__->register_method ({
+    name => 'lock', 
+    path => 'lock',
+    method => 'PUT',
+    description => "Lock specified storage",
+    parameters => {
+    	additionalProperties => 0,
+	properties => {
+	    storage => { 
+		type => 'string', format => 'pve-storage-id',
+	    },
+	    timeout => {
+		type => 'integer',
+		minimum => 1,
+		optional => 1,
+	    }
+	},
+    },
+    returns => { type => 'null' },
+    
+    code => sub {
+	my ($param) = @_;
 
-	printf "%-${maxlenname}s %5s %10d %d\n", $volid, 
-	$info->{format}, $info->{size}, $info->{vmid}; 
-    }
+	my $storeid = $param->{storage};
+	my $timeout = $param->{timeout};
 
-    foreach my $info (sort { $a->{format} cmp $b->{format} } @$list) {
-	next if $info->{vmid};
-	my $volname = $info->{volname};
-	my $volid = "$sid:$volname";
+	$timeout = 10 if !$timeout;
 
-	printf "%-${maxlenname}s %5s %10d\n", $volid, 
-	$info->{format}, $info->{size}; 
-    }
-}
+	PVE::Storage::parse_storage_id ($storeid);
 
-my $cmd = shift;
+	my $lockdir = "/var/run/pve-storage";
+	mkpath $lockdir;
 
-if ($cmd eq 'add') {
+	my $filename = "$lockdir/lock-$storeid.lock";
 
-    my $opts = {};
+	my $fh;
 
-    $opts->{storage} = shift;
+	eval {
 
-    PVE::API2::Storage::Config->cli_handler('create', \@ARGV, $opts);
+	    $SIG{PIPE} = sub { die "got signal - broken pipe\n"; };
+	    $SIG{INT} = $SIG{TERM} = $SIG{QUIT} = $SIG{HUP} = sub { die "got signal\n";  };
 
-} elsif ($cmd eq 'set') {
+	    local $SIG{ALRM} = sub { die "got timeout\n"; };
 
-    my $opts = {};
+	    alarm ($timeout);
 
-    $opts->{storage} = shift;
+	    $fh = new IO::File (">>$filename") ||
+		die "can't open lock for storage '$storeid' - $!\n";
 
-    PVE::API2::Storage::Config->cli_handler('update', \@ARGV, $opts);
+	    if (!flock ($fh, LOCK_EX|LOCK_NB)) {
+		print STDERR "trying to aquire storage lock '$storeid' ...";
+		if (!flock ($fh, LOCK_EX)) {
+		    print STDERR " failed\n";
+		    die "can't aquire lock for storage '$storeid' - $!\n";
+		}
+		print STDERR " OK\n";
+	    }
+	    alarm (0);
+	};
+	my $err = $@;
 
-} elsif ($cmd eq 'remove') {
+	alarm (0);
 
-    my $opts = {};
+	if ($err) {
+	    close ($fh) if $fh;
+	    print "lock $storeid: $err\n";
+	    *STDOUT->flush();
+	    return undef;
+	}
 
-    $opts->{storage} = shift;
+	print "lock $storeid: success\n";
+	*STDOUT->flush();
 
-    PVE::API2::Storage::Config->cli_handler('delete', \@ARGV, $opts);
+	while (my $line = <>) {
+	    chomp $line;
+	    last if $line =~ m/^release$/;
+	}
 
-} elsif ($cmd eq 'enable') {
+	close ($fh);
 
-    my $opts = {};
+	return undef;
+    }});
 
-    $opts->{storage} = shift;
-    $opts->{disable} = 0;
+my $print_content = sub {
+    my ($list) = @_;
 
-    PVE::API2::Storage::Config->cli_handler('update', \@ARGV, $opts);
+    # fixme: my $volid = "$sid:$volname"; ?
 
-} elsif ($cmd eq 'disable') {
+    my $maxlenname = 0;
+    foreach my $info (@$list) {
 
-    my $opts = {};
+	my $volname = $info->{volname};
+	my $volid = "$volname";
+	my $sidlen =  length ($volid);
+	$maxlenname = $sidlen if $sidlen > $maxlenname;
+    }
 
-    $opts->{storage} = shift;
-    $opts->{disable} = 1;
+    foreach my $info (@$list) {
+	my $volname = $info->{volname};
+	my $volid = "$volname";
+	next if !$info->{vmid};
 
-    PVE::API2::Storage::Config->cli_handler('update', \@ARGV, $opts);
+	printf "%-${maxlenname}s %5s %10d %d\n", $volid, 
+	$info->{format}, $info->{size}, $info->{vmid}; 
+    }
 
-} elsif ($cmd eq 'status') {
+    foreach my $info (sort { $a->{format} cmp $b->{format} } @$list) {
+	next if $info->{vmid};
+	my $volname = $info->{volname};
+	my $volid = "$volname";
 
-    my $opts = {};
+	printf "%-${maxlenname}s %5s %10d\n", $volid, 
+	$info->{format}, $info->{size}; 
+    }
+};
 
-    $opts->{node} = read_file('hostname');
+my $print_status = sub {
+    my $res = shift;
 
-    my $res = PVE::API2::Storage::Status->cli_handler('index', \@ARGV, $opts);
-
     my $maxlen = 0;
     foreach my $res (@$res) {
 	my $storeid = $res->{storage};
@@ -139,153 +193,46 @@
 	$res->{type},$res->{disable}, $res->{active},
 	$res->{avail}, $res->{used}, $per; 
     }
+};
 
-} elsif ($cmd eq 'list') {
+my $cmddef = {
+    add => [ "PVE::API2::Storage::Config", 'create', ['storage'] ],
+    set => [ "PVE::API2::Storage::Config", 'update', ['storage'] ],
+    remove => [ "PVE::API2::Storage::Config", 'delete', ['storage'] ],
+    status => [ "PVE::API2::Storage::Status", 'index', [], 
+		{ node => read_file('hostname') }, $print_status ],
+    list => [ "PVE::API2::Storage::Content", 'index', ['storage'], 
+	      { node => read_file('hostname') }, $print_content ],
+    alloc => [ "PVE::API2::Storage::Content", 'create', ['storage', 'vmid', 'filename', 'size'], 
+	       { node => read_file('hostname') }, sub {
+		   my $volid = shift;
+		   print "sucessfuly created '$volid'\n";
+	       }],
+    free => [ "PVE::API2::Storage::Content", 'delete', ['volume'],
+	      { node => read_file('hostname') } ],
+    scan => [ "PVE::API2::Storage::Scan", 'scan', ['method', 'server'],
+	      { node => read_file('hostname') }, sub  {
+		  my $res = shift;
 
-   my $opts = {};
+		  my $maxlen = 0;
+		  foreach my $k (keys %$res) {
+		      my $len = length ($k);
+		      $maxlen = $len if $len > $maxlen;
+		  }
+		  foreach my $k (keys %$res) {
+		      printf "%-${maxlen}s $res->{$k}\n", $k;
+		  }
+	      }],
+    path => [ __PACKAGE__, 'path', ['volume']],
+    lock => [ __PACKAGE__, 'lock', ['storage']],
+};
 
-   $opts->{storage} = shift;
-   $opts->{node} = read_file('hostname');
+my $cmd = shift;
 
-   my $res = PVE::API2::Storage::Content->cli_handler('index', \@ARGV, $opts);
+PVE::CLIHandler::handle_cmd($cmddef, "pvesm", $cmd, \@ARGV);
 
-   print_content($opts->{storage}, $res);
+exit 0;
 
-} elsif ($cmd eq 'alloc') {
-
-   my $opts = {};
-
-   $opts->{node} = read_file('hostname');
-
-   my $volid = PVE::API2::Storage::Content->cli_handler('create', \@ARGV, $opts);
-
-   print "sucessfuly created '$volid'\n";
-
-} elsif ($cmd eq 'free') {
-
-    if (scalar (@ARGV) != 1) {
-	die "wrong number of arguments\n";
-    }
-
-    my $opts = {};
-
-    $opts->{node} = read_file('hostname');
-    $opts->{volume} = shift;
-
-    PVE::API2::Storage::Content->cli_handler('delete', \@ARGV, $opts);
-
-} elsif ($cmd eq 'scan') {
-
-    if (scalar (@ARGV) != 2) {
-	die "wrong number of arguments\n";
-    }
-
-    my $opts = {};
-
-    $opts->{method} = shift;
-    $opts->{server} = shift;
-
-    my $res = PVE::API2::Storage::Scan->cli_handler('scan', \@ARGV, $opts);
-
-    my $maxlen = 0;
-    foreach my $k (keys %$res) {
-	my $len = length ($k);
-	$maxlen = $len if $len > $maxlen;
-    }
-    foreach my $k (keys %$res) {
-	printf "%-${maxlen}s $res->{$k}\n", $k;
-    }
-
-} elsif ($cmd eq 'path') {
-
-    my $opts = {};
-
-    if (scalar (@ARGV) != 1) {
-	die "wrong number of arguments\n";
-    }
-
-    my $volid = shift;
-
-    my $cfg = read_file('storagecfg');
-
-    my $path = PVE::Storage::path ($cfg, $volid);
-
-    print "$path\n";
-
-} elsif ($cmd eq 'lock') {
-
-    if (scalar (@ARGV) != 1 && scalar (@ARGV) != 2) {
-	die "wrong number of arguments\n";
-    }
-
-    my $storeid = shift;
-    my $timeout = shift;
-
-    $timeout = 10 if !$timeout;
-
-    PVE::Storage::parse_storage_id ($storeid);
-
-    die "got strange value for timeout ('$timeout')\n" if $timeout !~ m/^\d+$/;
-
-    my $lockdir = "/var/run/pve-storage";
-    mkpath $lockdir;
-
-    my $filename = "$lockdir/lock-$storeid.lock";
-
-    my $fh;
-
-    $SIG{PIPE} = sub { die "got signal - broken pipe\n"; };
-    $SIG{INT} = $SIG{TERM} = $SIG{QUIT} = $SIG{HUP} = sub { die "got signal\n";  };
-
-    eval {
-
-	local $SIG{ALRM} = sub { die "got timeout\n"; };
-
-	alarm ($timeout);
-
-	$fh = new IO::File (">>$filename") ||
-	    die "can't open lock for storage '$storeid' - $!\n";
-
-	if (!flock ($fh, LOCK_EX|LOCK_NB)) {
-	    print STDERR "trying to aquire storage lock '$storeid' ...";
-	    if (!flock ($fh, LOCK_EX)) {
-		print STDERR " failed\n";
-		die "can't aquire lock for storage '$storeid' - $!\n";
-	    }
-	    print STDERR " OK\n";
-	}
-	alarm (0);
-    };
-    my $err = $@;
-
-    alarm (0);
-
-    if ($err) {
-	close ($fh) if $fh;
-	print "lock $storeid: $err\n";
-	*STDOUT->flush();
-	exit (0);
-    }
-
-    print "lock $storeid: success\n";
-    *STDOUT->flush();
-
-    while (my $line = <>) {
-	chomp $line;
-	last if $line =~ m/^release$/;
-    }
-
-    close ($fh);
-
-    exit (0);
-
-} else {
-    print_usage ("unknown command '$cmd'");
-    exit (-1);
-}
-
-exit (0);
-
 __END__
 
 =head1 NAME
@@ -309,10 +256,12 @@
     pvesm add <STORAGE_ID> lvm --vgname <VGNAME>
     pvesm add <STORAGE_ID> iscsi --portal <HOST[:PORT]> --target <TARGET> 
 
-    # enable/disable storage pools
-    pvesm enable <STORAGE_ID>
-    pvesm disable <STORAGE_ID>
+    # disable storage pools
+    pvesm set <STORAGE_ID> --disable 1
 
+    # enable storage pools
+    pvesm set <STORAGE_ID> --disable 0
+
     # change/set storage options
     pvesm set <STORAGE_ID> <OPTIONS>
     pvesm set <STORAGE_ID> --shared 1
@@ -333,23 +282,20 @@
     # free volumes (warning: destroy/deletes all volume data)
     pvesm free <VOLUME_ID>
 
-    # list storage pools
-    pvesm list
+    # list storage status
+    pvesm status
 
-    # list all disk volumes
-    pvesm list --all
-    
     # list storage contents
-    pvesm list --id <STORAGE_ID> [--vmid <VMID>]
+    pvesm list <STORAGE_ID> [--vmid <VMID>]
 
     # list volumes allocated by VMID
-    pvesm list --vmid <VMID> [--id <STORAGE_ID>]
+    pvesm list <STORAGE_ID> --vmid <VMID> 
 
     # list iso images
-    pvesm list --iso [--id <STORAGE_ID>]
+    pvesm list <STORAGE_ID> --iso 
 
     # list openvz templates
-    pvesm list --vztmpl [--id <STORAGE_ID>]
+    pvesm list <STORAGE_ID> --vztmpl
 
     # show filesystem path for a volume
     pvesm path <VOLUME_ID>



More information about the pve-devel mailing list