[pve-devel] r5508 - in pve-manager/pve2: lib/PVE lib/PVE/API2 www/manager www/manager/data www/manager/form

svn-commits at proxmox.com svn-commits at proxmox.com
Fri Feb 11 10:39:54 CET 2011


Author: dietmar
Date: 2011-02-11 10:39:54 +0100 (Fri, 11 Feb 2011)
New Revision: 5508

Modified:
   pve-manager/pve2/lib/PVE/API2.pm
   pve-manager/pve2/lib/PVE/API2/Cluster.pm
   pve-manager/pve2/lib/PVE/API2/Nodes.pm
   pve-manager/pve2/lib/PVE/REST.pm
   pve-manager/pve2/www/manager/PVECache.js
   pve-manager/pve2/www/manager/StorageBrowser.js
   pve-manager/pve2/www/manager/data/ObjectReader.js
   pve-manager/pve2/www/manager/form/ModifyDirStorage.js
Log:
fix object hierarchy


Modified: pve-manager/pve2/lib/PVE/API2/Cluster.pm
===================================================================
--- pve-manager/pve2/lib/PVE/API2/Cluster.pm	2011-02-11 09:37:26 UTC (rev 5507)
+++ pve-manager/pve2/lib/PVE/API2/Cluster.pm	2011-02-11 09:39:54 UTC (rev 5508)
@@ -5,6 +5,7 @@
 
 use PVE::SafeSyslog;
 use PVE::Cluster;
+use PVE::Storage;
 use JSON;
 
 use Data::Dumper; # fixme: remove
@@ -38,6 +39,7 @@
     
 	my $result = [
 	    { name => 'log' },
+	    { name => 'storage' },
 	    ];
 
 	return $result;
@@ -82,4 +84,59 @@
 	return $list;
     }});
 
+__PACKAGE__->register_method ({
+    name => 'storage', 
+    path => 'storage', 
+    method => 'GET',
+    description => "Cluster wide storage status.",
+    parameters => {
+    	additionalProperties => 0,
+	properties => {},
+    },
+    returns => {
+	type => 'array',
+	items => {
+	    type => "object",
+	    properties => {},
+	},
+    },
+    code => sub {
+	my ($param) = @_;
+
+	my $nodes = PVE::Cluster::get_nodelist();
+
+	my $cfg = PVE::Storage::config();
+
+	my @sids =  PVE::Storage::storage_ids ($cfg);
+
+	# fixme: add storage status ('disk', 'maxdisk')
+ 
+	my $res = [];
+	foreach my $storeid (@sids) {
+	    my $scfg =  PVE::Storage::storage_config ($cfg, $storeid);
+	    if ($scfg->{shared}) {
+		push @$res,{ 
+		    name => $storeid, 
+		    storage => $storeid, 
+		    type => $scfg->{type}, 
+		    shared => 1
+		}; 
+	    } else {
+		# we create a entry for each node
+		foreach my $nd (@$nodes) {
+		    my $node = $nd->{node};
+		    push @$res, { 
+			name => "$storeid ($node)", 
+			storage => $storeid, 
+			node => $node, 
+			type => $scfg->{type}, 
+			shared => 0
+		    }; 
+		}
+	    }
+	}
+
+	return $res;
+    }});
+
 1;

Modified: pve-manager/pve2/lib/PVE/API2/Nodes.pm
===================================================================
--- pve-manager/pve2/lib/PVE/API2/Nodes.pm	2011-02-11 09:37:26 UTC (rev 5507)
+++ pve-manager/pve2/lib/PVE/API2/Nodes.pm	2011-02-11 09:39:54 UTC (rev 5508)
@@ -12,6 +12,8 @@
 use PVE::JSONSchema qw(get_standard_option);
 use PVE::AccessControl;
 use PVE::API2::Services;
+use PVE::API2::Storage::Scan;
+use PVE::API2::Storage::Status;
 use JSON;
 
 use base qw(PVE::RESTHandler);
@@ -22,6 +24,16 @@
 });
 
 __PACKAGE__->register_method ({
+    subclass => "PVE::API2::Storage::Scan",  
+    path => 'scan',
+});
+
+__PACKAGE__->register_method ({
+    subclass => "PVE::API2::Storage::Status",  
+    path => 'storage',
+});
+
+__PACKAGE__->register_method ({
     name => 'index', 
     path => '', 
     method => 'GET',
@@ -46,7 +58,12 @@
 	my $result = [
 	    { name => 'syslog' },
 	    { name => 'vncshell' },
+	    { name => 'time' },
+	    { name => 'dns' },
 	    { name => 'services' },
+	    { name => 'scan' },
+	    { name => 'storage' },
+	    { name => 'upload' },
 	    ];
 
 	return $result;
@@ -342,6 +359,75 @@
 	return undef;
     }});
 
+__PACKAGE__->register_method ({
+    name => 'upload', 
+    path => 'upload',
+    method => 'POST',
+    description => "Upload content.",
+    parameters => {
+    	additionalProperties => 0,
+	properties => { 
+	    node => get_standard_option('pve-node'),
+	    storage => get_standard_option('pve-storage-id'),
+	    filename => { 
+		description => "The name of the file to create/upload.",
+		type => 'string',
+	    },
+	    vmid => get_standard_option
+		('pve-vmid', { 
+		    description => "Specify owner VM",
+		    optional => 1,
+		 }),
+	},
+    },
+    returns => {
+	description => "Volume identifier",
+	type => 'string',
+    },
+    code => sub {
+	my ($param) = @_;
+
+	# todo: can we proxy file uploads to remote nodes?
+	if ($param->{node} ne PVE::INotify::nodename()) {
+	    raise_param_exc({ node => "can't upload content to remote node" });
+	}
+
+	my $node = $param->{node};
+	my $storeid = $param->{storage};
+	my $name = $param->{filename};
+
+	my $fh = CGI::upload('filename') || die "unable to get file handle\n";
+
+	syslog ('info', "UPLOAD $name to $node $storeid");
+	
+	# fixme:
+	die "upload not implemented\n";
+
+	my $buffer = "";
+	my $tmpname = "/tmp/proxmox_upload-$$.bin";
+
+	eval {
+	    open FILE, ">$tmpname" || die "can't open temporary file '$tmpname' - $!\n";
+	    while (read($fh, $buffer, 32768)) {
+		die "write failed - $!" unless print FILE $buffer;
+	    }
+	    close FILE || die " can't close temporary file '$tmpname' - $!\n";
+	};
+	my $err = $@;
+
+	if ($err) {
+	    unlink $tmpname;
+	    die $err;
+	}
+
+	unlink $tmpname; # fixme: proxy to local host import
+
+	# fixme: return volid
+
+	return undef;
+
+    }});
+
 package PVE::API2::Nodes;
 
 use strict;

Modified: pve-manager/pve2/lib/PVE/API2.pm
===================================================================
--- pve-manager/pve2/lib/PVE/API2.pm	2011-02-11 09:37:26 UTC (rev 5507)
+++ pve-manager/pve2/lib/PVE/API2.pm	2011-02-11 09:39:54 UTC (rev 5508)
@@ -12,8 +12,8 @@
 use PVE::API2::VM;
 use PVE::API2::Cluster;
 use PVE::API2::Nodes;
-use PVE::API2::Storage;
 use PVE::API2::AccessControl;
+use PVE::API2::Storage::Config;
 
 __PACKAGE__->register_method ({
     subclass => "PVE::API2::VM",  
@@ -31,7 +31,7 @@
 });
 
 __PACKAGE__->register_method ({
-    subclass => "PVE::API2::Storage",  
+    subclass => "PVE::API2::Storage::Config",  
     path => 'storage',
 });
 

Modified: pve-manager/pve2/lib/PVE/REST.pm
===================================================================
--- pve-manager/pve2/lib/PVE/REST.pm	2011-02-11 09:37:26 UTC (rev 5507)
+++ pve-manager/pve2/lib/PVE/REST.pm	2011-02-11 09:39:54 UTC (rev 5508)
@@ -129,7 +129,7 @@
     } elsif ($format eq 'htmljs') {
 	# we use this for extjs file upload forms
 	$ct = 'text/html';
-	$raw =  encode_entities(to_json($data, {utf8 => 1, allow_nonref => 1}));
+	$raw = encode_entities(to_json($data, {utf8 => 1, allow_nonref => 1}));
     } else {
 	$ct = 'text/plain';
 	$raw = to_json($data, {utf8 => 1, allow_nonref => 1, pretty => 1});

Modified: pve-manager/pve2/www/manager/PVECache.js
===================================================================
--- pve-manager/pve2/www/manager/PVECache.js	2011-02-11 09:37:26 UTC (rev 5507)
+++ pve-manager/pve2/www/manager/PVECache.js	2011-02-11 09:39:54 UTC (rev 5508)
@@ -53,7 +53,7 @@
 		itype: 'storage',
 		idProperty: 'name',
 		autoDestroy: false,
-		url: '/api2/json/storage/index',
+		url: '/api2/json/cluster/storage',
 		fields: fields
 	    });
 

Modified: pve-manager/pve2/www/manager/StorageBrowser.js
===================================================================
--- pve-manager/pve2/www/manager/StorageBrowser.js	2011-02-11 09:37:26 UTC (rev 5507)
+++ pve-manager/pve2/www/manager/StorageBrowser.js	2011-02-11 09:39:54 UTC (rev 5508)
@@ -15,30 +15,32 @@
 	var params = ct ? { content: ct } : null;
 
 	var store = new Ext.data.JsonStore({
-	    url: "/api2/json/storage/content/" + node + "/" + storeid,
+	    url: "/api2/json/nodes/" + node + "/storage/" + storeid,
 	    autoDestory: true,
 	    autoLoad: true,
 	    root: 'data',
 	    restful: true, // use GET, not POST
 	    baseParams: params,
-	    fields: [ 'format', 'size', 'volname' ]
+	    fields: [ 'format', 'size', 'volid' ]
 	});
 
 	Ext.apply(self, {
 	    stateful: false,
 	    store: store,
+	    autoExpandColumn: 'volid',
 	    tbar: [
 		'->',
 		{
 		    xtype: 'form',
-		    url: '/api2/htmljs/storage/content/' + node + '/' + storeid,
+		    url: "/api2/htmljs/nodes/" + node + "/upload",
+		    baseParams:	{ storage: storeid },
 		    fileUpload: true,
 		    height: 22,
 		    border: false,
 		    baseCls: 'plain', 
 		    items: {
 			xtype: 'fileuploadfield',
-			name: 'upload',
+			name: 'filename',
 			buttonOnly: true,
 			buttonText: 'Upload',
 			listeners: {
@@ -67,26 +69,24 @@
  		    }
 		}
 	    ],	    
-	    colModel: new Ext.grid.ColumnModel({
-		columns: [
-		    {
-			header: 'Name',
-			width: 300,
-			dataIndex: 'volname'
-		    },
-		    {
-			header: 'Format',
-			width: 100,
-			dataIndex: 'format'
-		    },
-		    {
-			header: 'Size',
-			width: 100,
-			dataIndex: 'size'
-		    }
-		]
-	    }),
-	    viewConfig: { forceFit: true },	    
+	    columns: [
+		{
+		    id: 'volid',
+		    header: 'Name',
+		    dataIndex: 'volid'
+		},
+		{
+		    header: 'Format',
+		    width: 100,
+		    dataIndex: 'format'
+		},
+		{
+		    header: 'Size',
+		    width: 100,
+		    renderer: PVE.Utils.format_size,
+		    dataIndex: 'size'
+		}
+	    ],
 
 	    sm: new Ext.grid.RowSelectionModel({singleSelect:true})
 
@@ -109,23 +109,19 @@
 	if (!storeid)
 	    throw "no storage id specified";
 
-	var smid = Ext.util.base64.encode("storage.status." + node + '.' + storeid);  
-	var store = Ext.StoreMgr.lookup(smid);
+	var store = new PVE.data.ObjectStore({
+	    url: "/api2/json/nodes/" + node + "/storage/",
+	    baseParams: { storage: storeid },
+	    method: 'GET',
+	    restful: true, // use GET, not POST
+	    autoDestroy: true,
+	    rows: {
+		total: { header: 'Capacity' },
+		used: { header: 'Used' },
+		free: { header: 'Free' }
+	    }
+	});
 
-	if (!store) {
-	    store = new PVE.data.ObjectStore({
-		url: "/api2/json/storage/status/" + node + "/" + storeid,
-		method: 'GET',
-		id: smid,
-		simpleSelect: true,
-		rows: {
-		    total: { header: 'Capacity' },
-		    used: { header: 'Used' },
-		    free: { header: 'Free' }
-		}
-	    });
-	}
-
 	store.load();
 
 	Ext.apply(self, {
@@ -291,7 +287,7 @@
 	
 	if (!store) {
 	    store = new PVE.data.ObjectStore({
-		url: "/api2/json/storage/config/" + storeid,
+		url: "/api2/json/storage/" + storeid,
 		method: 'GET',
 		id: smid,
 		rows: {
@@ -299,7 +295,6 @@
 		    path: { header: 'Path' },
 		    shared: { header: 'Shared', renderer: PVE.Utils.format_boolean },
 		    disable: { header: 'Disabled', renderer: PVE.Utils.format_boolean },
-		    time: { header: 'TIME' },
 		    content: { header: 'Content', renderer: PVE.Utils.format_content_types }
 		}
 	    });

Modified: pve-manager/pve2/www/manager/data/ObjectReader.js
===================================================================
--- pve-manager/pve2/www/manager/data/ObjectReader.js	2011-02-11 09:37:26 UTC (rev 5507)
+++ pve-manager/pve2/www/manager/data/ObjectReader.js	2011-02-11 09:39:54 UTC (rev 5508)
@@ -1,7 +1,12 @@
 Ext.ns("PVE.data");
 
-// a reader to store a single JSON Object (hash) into a storage
-
+/* A reader to store a single JSON Object (hash) into a storage.
+ * Also accepts an array containing a single hash. 
+ * So it can read:
+ *
+ * example1: { data: "xyz" }
+ * example2: [ {  data: "xyz" } ]
+ */
 PVE.data.ObjectReader = Ext.extend(Ext.data.JsonReader, {
 
     constructor: function(config){
@@ -21,6 +26,13 @@
        if (returnRecords !== true)
 	    throw "not implemented";
 
+	if (Ext.isArray(root)) {
+	    if (root.length == 1)
+		root = root[0];
+	    else
+		root = {};
+	}
+
         var Record = this.recordType;
  	var rs = [];
 	var rows = this.rows;

Modified: pve-manager/pve2/www/manager/form/ModifyDirStorage.js
===================================================================
--- pve-manager/pve2/www/manager/form/ModifyDirStorage.js	2011-02-11 09:37:26 UTC (rev 5507)
+++ pve-manager/pve2/www/manager/form/ModifyDirStorage.js	2011-02-11 09:39:54 UTC (rev 5508)
@@ -68,7 +68,7 @@
 	// NOTE: If subclassing FormPanel, any configuration options for 
 	// the BasicForm must be applied to initialConfig
 	Ext.apply(self, Ext.apply(self.initialConfig, {
-	    url: "/api2/extjs/storage/config/" + storeid,
+	    url: "/api2/extjs/storage/" + storeid,
 	    method: 'PUT',
 
 	    items: {
@@ -98,7 +98,7 @@
 	var form = self.getForm();
 
 	form.load({
-	    url: "/api2/extjs/storage/config/" + storeid,
+	    url: "/api2/extjs/storage/" + storeid,
 	    method: 'GET'
 	});
 



More information about the pve-devel mailing list