[pve-devel] r5037 - in pve-storage/pve2: . PVE/API2 PVE/API2/Storage

svn-commits at proxmox.com svn-commits at proxmox.com
Fri Aug 20 11:24:50 CEST 2010


Author: dietmar
Date: 2010-08-20 09:24:50 +0000 (Fri, 20 Aug 2010)
New Revision: 5037

Modified:
   pve-storage/pve2/PVE/API2/Storage.pm
   pve-storage/pve2/PVE/API2/Storage/Content.pm
   pve-storage/pve2/PVE/API2/Storage/Status.pm
   pve-storage/pve2/pvesm
Log:
split out some helper classes


Modified: pve-storage/pve2/PVE/API2/Storage/Content.pm
===================================================================
--- pve-storage/pve2/PVE/API2/Storage/Content.pm	2010-08-20 08:53:28 UTC (rev 5036)
+++ pve-storage/pve2/PVE/API2/Storage/Content.pm	2010-08-20 09:24:50 UTC (rev 5037)
@@ -16,79 +16,8 @@
 
 __PACKAGE__->register_method ({
     name => 'index', 
-    path => '',  
-    method => 'GET',
-    description => "List cluster nodes.",
-    parameters => {
-    	additionalProperties => 0,
-	properties => {},
-    },
-    returns => {
-	type => 'array',
-	items => {
-	    type => "object",
-	    properties => { node => { type => 'string' } },
-	},
-	links => [ { rel => 'child', href => "{node}" } ],
-    },
-    code => sub {
-	my ($conn, $param) = @_;
-
-	# fixme: use the real list
-	my $nodes = [ 
-	    { node => 'node-0'},
-	    { node => 'node-1'},
-	    { node => 'node-2'},
-	    { node => 'node-3'},
-	    ];
-
-	return $nodes;
-
-    }});
-
-__PACKAGE__->register_method ({
-    name => 'list_ids', 
-    path => '{node}', 
-    method => 'GET',
-    description => "List storage IDs.",
-    parameters => {
-    	additionalProperties => 0,
-	properties => {
-	    node => { type => 'string', format => 'pve-node' },
-	},
-    },
-    returns => {
-	type => 'array',
-	items => {
-	    type => "object",
-	    properties => { storage => { type => 'string' } },
-	},
-	links => [ { rel => 'child', href => "{storage}" } ],
-    },
-    code => sub {
-	my ($conn, $param) = @_;
-
-	my $cfg = read_file ("storagecfg");
-
-	my $node = $param->{node};
-
-	# fixme: verify node (node exists)?
-
-	my @sids =  PVE::Storage::storage_ids ($cfg);
-
-	my $res = [];
-	foreach my $storeid (@sids) {
-	    # fixme: check if storeage exists on node ?
-	    push @$res, { storage => $storeid };
-	}
-
-	return $res;
-    }});
-
-__PACKAGE__->register_method ({
-    name => 'list', 
     protected => 1,
-    path => '{node}/{storage}',
+    path => '',
     method => 'GET',
     description => "List storage content.",
     parameters => {
@@ -159,7 +88,7 @@
 
 __PACKAGE__->register_method ({
     name => 'create', 
-    path => '{node}/{storage}',
+    path => '',
     method => 'POST',
     description => "Allocate or upload content.",
     parameters => {
@@ -277,11 +206,78 @@
 
     }});
 
+# we allow to pass volume names (without storage prefix) if the storage
+# is specified as separate parameter.
+my $real_volume_id = sub {
+    my ($storeid, $volume) = @_;
+
+    my $volid;
+
+    if ($volume =~ m/:/) {
+	eval {
+	    my ($sid, $volname) = PVE::Storage::parse_volume_id ($volume);
+	    raise_param_exc({ storage => "storage ID missmatch" }) 
+		if $storeid && $sid ne $storeid;
+	    $volid = $volume;
+	};
+	raise_param_exc({ volume => $@}) if $@; 
+	   
+    } else {
+	raise_param_exc({ volume => "no storage speficied - incomplete volume ID" }) 
+	    if !$storeid;
+	
+	$volid = "$storeid:$volume";
+    }
+
+    return $volid;
+};
+
 __PACKAGE__->register_method ({
+    name => 'info',
+    protected => 1,
+    path => '{volume}',
+    method => 'GET',
+    description => "Get volume attributes",
+    parameters => {
+    	additionalProperties => 0,
+	properties => { 
+	    node => { type => 'string', format => 'pve-node' },
+	    storage => { 
+		type => 'string', format => 'pve-storage-id',
+		optional => 1,
+	    },
+	    volume => {
+		description => "Volume identifier",
+		type => 'string' 
+	    },
+	},
+    },
+    returns => { type => 'object' },
+    code => sub {
+	my ($conn, $param) = @_;
+
+	# fixme: connect to node
+
+	my $volid = &$real_volume_id($param->{storage}, $param->{volume});
+
+	my $cfg = read_file('storagecfg');
+
+	my $path = PVE::Storage::path($cfg, $volid);
+	my ($size, $format, $used) = PVE::Storage::file_size_info ($path);
+
+	# fixme: return more attributes?
+	return {
+	    path => $path,
+	    size => $size,
+            used => $used,
+	};
+}});
+
+
+__PACKAGE__->register_method ({
     name => 'delete',
     protected => 1,
-    # fixme: volid is allowed to contain '/' - how can we fix that ?
-    path => '{node}/{storage}/{volid}',
+    path => '{volume}',
     method => 'DELETE',
     description => "Delete volume",
     parameters => {
@@ -304,30 +300,121 @@
 
 	# fixme: connect to node
 
-	my $storeid = $param->{storage};
+	my $volid = &$real_volume_id($param->{storage}, $param->{volume});
 
-	my $volid;
-
-	if ($param->{volume} =~ m/:/) {
-	    eval {
-		my ($sid, $volname) = PVE::Storage::parse_volume_id ($param->{volume});
-		raise_param_exc({ storage => "storage ID missmatch" }) 
-		    if $storeid && $sid ne $storeid;
-		$volid = $param->{volume};
-	    };
-	    raise_param_exc({ volume => $@}) if $@; 
-	   
-	} else {
-	    raise_param_exc({ volume => "no storage speficied - incomplete volume ID" }) 
-		if !$storeid;
-	    
-	    $volid = "$storeid:$param->{volume}";
-	}
-
 	my $cfg = read_file('storagecfg');
 
 	PVE::Storage::vdisk_free ($cfg, $volid);
 
 	return undef;
+}});
+
+package PVE::API2::Storage::ContentIDList;
+
+use strict;
+use warnings;
+
+use PVE::SafeSyslog;
+use PVE::INotify qw(read_file);;
+use PVE::Storage;
+
+use PVE::RESTHandler;
+
+use PVE::API2::Storage::Content;
+
+use base qw(PVE::RESTHandler);
+
+__PACKAGE__->register_method ({
+    subclass => "PVE::API2::Storage::Content", 
+    # set fragment delimiter (no subdirs) - we need that, because volume
+    # IDs may contain a slash '/' 
+    fragmentDelimiter => '', 
+    path => '{storage}',
+});
+
+__PACKAGE__->register_method ({
+    name => 'index', 
+    path => '', 
+    method => 'GET',
+    description => "List storage IDs.",
+    parameters => {
+    	additionalProperties => 0,
+	properties => {
+	    node => { type => 'string', format => 'pve-node' },
+	},
+    },
+    returns => {
+	type => 'array',
+	items => {
+	    type => "object",
+	    properties => { storage => { type => 'string' } },
+	},
+	links => [ { rel => 'child', href => "{storage}" } ],
+    },
+    code => sub {
+	my ($conn, $param) = @_;
+
+	my $cfg = read_file ("storagecfg");
+
+	my $node = $param->{node};
+
+	# fixme: verify node (node exists)?
+
+	my @sids =  PVE::Storage::storage_ids ($cfg);
+
+	my $res = [];
+	foreach my $storeid (@sids) {
+	    # fixme: check if storeage exists on node ?
+	    push @$res, { storage => $storeid };
+	}
+
+	return $res;
     }});
+
+package PVE::API2::Storage::ContentNodeList;
+
+use strict;
+use warnings;
+
+use PVE::RESTHandler;
+
+use base qw(PVE::RESTHandler);
+
+__PACKAGE__->register_method ({
+    subclass => "PVE::API2::Storage::ContentIDList",  
+    path => '{node}',
+});
+
+__PACKAGE__->register_method ({
+    name => 'index', 
+    path => '',  
+    method => 'GET',
+    description => "List cluster nodes.",
+    parameters => {
+    	additionalProperties => 0,
+	properties => {},
+    },
+    returns => {
+	type => 'array',
+	items => {
+	    type => "object",
+	    properties => { node => { type => 'string' } },
+	},
+	links => [ { rel => 'child', href => "{node}" } ],
+    },
+    code => sub {
+	my ($conn, $param) = @_;
+
+	# fixme: use the real list
+	my $nodes = [ 
+	    { node => 'node-0'},
+	    { node => 'node-1'},
+	    { node => 'node-2'},
+	    { node => 'node-3'},
+	    ];
+
+	return $nodes;
+
+    }});
+
 1;

Modified: pve-storage/pve2/PVE/API2/Storage/Status.pm
===================================================================
--- pve-storage/pve2/PVE/API2/Storage/Status.pm	2010-08-20 08:53:28 UTC (rev 5036)
+++ pve-storage/pve2/PVE/API2/Storage/Status.pm	2010-08-20 09:24:50 UTC (rev 5037)
@@ -12,42 +12,11 @@
 
 my @ctypes = qw(images vztmpl iso backup);
 
+
 __PACKAGE__->register_method ({
     name => 'index', 
-    path => '',  
-    method => 'GET',
-    description => "List cluster nodes.",
-    parameters => {
-    	additionalProperties => 0,
-	properties => {},
-    },
-    returns => {
-	type => 'array',
-	items => {
-	    type => "object",
-	    properties => { node => { type => 'string' } },
-	},
-	links => [ { rel => 'child', href => "{node}" } ],
-    },
-    code => sub {
-	my ($conn, $param) = @_;
-
-	# fixme: use the real list
-	my $nodes = [ 
-	    { node => 'node-0'},
-	    { node => 'node-1'},
-	    { node => 'node-2'},
-	    { node => 'node-3'},
-	    ];
-
-	return $nodes;
-
-    }});
-
-__PACKAGE__->register_method ({
-    name => 'list_status', 
     protected => 1,
-    path => 'status/{node}',
+    path => '',
     method => 'GET',
     description => "Get status for all datastores.",
     parameters => {
@@ -83,10 +52,9 @@
     }});
 
 __PACKAGE__->register_method ({
-    name => 'get_status', 
+    name => 'status', 
     protected => 1,
-    # /storage/status/{nodeid}/{storeid}
-    path => 'status/{node}/{storage}',
+    path => '{storage}',
     method => 'GET',
     description => "Get status for specific datastore.",
     parameters => {
@@ -116,4 +84,50 @@
 	return $info->{$storeid};
     }});
 
+package PVE::API2::Storage::StatusNodeList;
+
+use strict;
+use warnings;
+
+use PVE::RESTHandler;
+
+use base qw(PVE::RESTHandler);
+
+__PACKAGE__->register_method ({
+    subclass => "PVE::API2::Storage::Status",  
+    path => '{node}',
+});
+
+__PACKAGE__->register_method ({
+    name => 'index', 
+    path => '',  
+    method => 'GET',
+    description => "List cluster nodes.",
+    parameters => {
+    	additionalProperties => 0,
+	properties => {},
+    },
+    returns => {
+	type => 'array',
+	items => {
+	    type => "object",
+	    properties => { node => { type => 'string' } },
+	},
+	links => [ { rel => 'child', href => "{node}" } ],
+    },
+    code => sub {
+	my ($conn, $param) = @_;
+
+	# fixme: use the real list
+	my $nodes = [ 
+	    { node => 'node-0'},
+	    { node => 'node-1'},
+	    { node => 'node-2'},
+	    { node => 'node-3'},
+	    ];
+
+	return $nodes;
+
+    }});
+
 1;

Modified: pve-storage/pve2/PVE/API2/Storage.pm
===================================================================
--- pve-storage/pve2/PVE/API2/Storage.pm	2010-08-20 08:53:28 UTC (rev 5036)
+++ pve-storage/pve2/PVE/API2/Storage.pm	2010-08-20 09:24:50 UTC (rev 5037)
@@ -9,6 +9,11 @@
 use HTTP::Status qw(:constants);
 use Storable qw(dclone);
 
+use PVE::API2::Storage::Config;
+use PVE::API2::Storage::Scan;
+use PVE::API2::Storage::Content;
+use PVE::API2::Storage::Status;
+
 use Data::Dumper; # fixme: remove
 
 use PVE::RESTHandler;
@@ -30,12 +35,12 @@
 });
 
 __PACKAGE__->register_method ({
-    subclass => "PVE::API2::Storage::Content",  
+    subclass => "PVE::API2::Storage::ContentNodeList",  
     path => 'content',
 });
 
 __PACKAGE__->register_method ({
-    subclass => "PVE::API2::Storage::Status",  
+    subclass => "PVE::API2::Storage::StatusNodeList",  
     path => 'status',
 });
 

Modified: pve-storage/pve2/pvesm
===================================================================
--- pve-storage/pve2/pvesm	2010-08-20 08:53:28 UTC (rev 5036)
+++ pve-storage/pve2/pvesm	2010-08-20 09:24:50 UTC (rev 5037)
@@ -113,7 +113,7 @@
 
     $opts->{node} = read_file('hostname');
 
-    my $res = PVE::API2::Storage::Status->cli_handler('list_status', \@ARGV, $opts);
+    my $res = PVE::API2::Storage::Status->cli_handler('index', \@ARGV, $opts);
 
     my $maxlen = 0;
     foreach my $res (@$res) {
@@ -139,7 +139,7 @@
    $opts->{storage} = shift;
    $opts->{node} = read_file('hostname');
 
-   my $res = PVE::API2::Storage::Content->cli_handler('list', \@ARGV, $opts);
+   my $res = PVE::API2::Storage::Content->cli_handler('index', \@ARGV, $opts);
 
    print_content($opts->{storage}, $res);
 



More information about the pve-devel mailing list