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

svn-commits at proxmox.com svn-commits at proxmox.com
Fri Jul 16 17:47:53 CEST 2010


Author: dietmar
Date: 2010-07-16 15:47:53 +0000 (Fri, 16 Jul 2010)
New Revision: 4908

Modified:
   pve-manager/pve2/lib/PVE/API2/Storage.pm
   pve-manager/pve2/lib/PVE/APIDaemon.pm
   pve-manager/pve2/lib/PVE/JSONSchema.pm
   pve-manager/pve2/lib/PVE/REST.pm
   pve-manager/pve2/lib/PVE/RESTHandler.pm
   pve-manager/pve2/www/manager/PVEUtils.js
   pve-manager/pve2/www/manager/StorageBrowser.js
   pve-manager/pve2/www/manager/form/ModifyDirStorage.js
   pve-manager/pve2/www/manager/form/StdForm.js
Log:
make the storage form functional


Modified: pve-manager/pve2/lib/PVE/API2/Storage.pm
===================================================================
--- pve-manager/pve2/lib/PVE/API2/Storage.pm	2010-07-16 12:01:11 UTC (rev 4907)
+++ pve-manager/pve2/lib/PVE/API2/Storage.pm	2010-07-16 15:47:53 UTC (rev 4908)
@@ -95,10 +95,66 @@
     $scfg->{digest} = $cfg->{digest};
     $scfg->{time} = time(); # fixme: remove
 
+   
+    my @cta;
+    foreach my $ct (keys %{$scfg->{content}}) {
+	push @cta, $ct if $scfg->{content}->{$ct};
+    } 
+
+    $scfg->{content} =  join(',', @cta);
+ 
     return $scfg;
 }
 
 __PACKAGE__->register_method ({
+    name => 'update_config',
+    protected => 1,
+    match_re => [ 'config', '\S+' ], 
+    method => 'PUT',
+    description => "Update storage configuration.",
+    parameters => {
+    	additionalProperties => 0,
+	properties => { 
+	    path => {
+		type => 'string',
+		optional => 1,
+	    },
+	    content => {
+		type => 'string',
+		optional => 1,
+	    },
+	    disable => {
+		type => 'boolean',
+		optional => 1,
+	    },
+	    shared => {
+		type => 'boolean',
+		optional => 1,
+	    },
+	    digest => {
+		type => 'string',
+		optional => 1,
+	    }
+	},
+    },
+    returns => { type => 'null' },
+});
+sub update_config {
+    my ($conn, $resp, $param) = @_;
+
+    syslog("info", Dumper($param));
+
+    my ($storeid) = $conn->{rel_uri} =~ m!/([^/]+)$!;
+ 
+    my $digest = $param->{digest};
+    delete($param->{digest});
+
+    PVE::Storage::storage_set($storeid, $param, $digest);
+
+    return undef;
+}
+
+__PACKAGE__->register_method ({
     name => 'list_storage_config', 
     match_re => [ 'config' ], # /storage/config
     method => 'GET',

Modified: pve-manager/pve2/lib/PVE/APIDaemon.pm
===================================================================
--- pve-manager/pve2/lib/PVE/APIDaemon.pm	2010-07-16 12:01:11 UTC (rev 4907)
+++ pve-manager/pve2/lib/PVE/APIDaemon.pm	2010-07-16 15:47:53 UTC (rev 4908)
@@ -261,7 +261,7 @@
 			    PVE::REST::prepare_response_data($format, $res);
 			    my ($raw, $ct) = PVE::REST::format_response_data($format, $res, $uri);
 
-			    my $response = HTTP::Response->new($res->{status});
+			    my $response = HTTP::Response->new($res->{status}, $res->{message});
 			    $response->header("Content-Type" => $ct);
 			    $response->header("Pragma", "no-cache");
 

Modified: pve-manager/pve2/lib/PVE/JSONSchema.pm
===================================================================
--- pve-manager/pve2/lib/PVE/JSONSchema.pm	2010-07-16 12:01:11 UTC (rev 4907)
+++ pve-manager/pve2/lib/PVE/JSONSchema.pm	2010-07-16 15:47:53 UTC (rev 4908)
@@ -103,11 +103,14 @@
 		if ($type eq 'string') {
 		    return 1; # nothing to check ?
 		} elsif ($type eq 'boolean') {
-		    if ($value !~ m/^[01]$/) {
+		    if ($value =~ m/^(1|yes|on)$/i) {
+			return 1;
+		    } elsif ($value =~ m/^(0|no|off)$/i) {
+			return 0;
+		    } else {
 			add_error($errors, $path, "type check ('$type') failed - got '$value'");
 			return undef;
 		    }
-		    return 1;
 		} elsif ($type eq 'integer') {
 		    if (!is_integer($value)) {
 			add_error($errors, $path, "type check ('$type') failed - got '$value'");

Modified: pve-manager/pve2/lib/PVE/REST.pm
===================================================================
--- pve-manager/pve2/lib/PVE/REST.pm	2010-07-16 12:01:11 UTC (rev 4907)
+++ pve-manager/pve2/lib/PVE/REST.pm	2010-07-16 15:47:53 UTC (rev 4908)
@@ -140,6 +140,8 @@
 	# HACK: extjs wants 'success' property instead of useful HTTP status codes
 	if (is_error($res->{status})) {
 	    $success = 0;
+	    $new->{message} = $res->{message} || status_message($res->{status});
+	    $res->{message} = undef;
 	    $res->{status} = HTTP_OK;
 	}
 	$new->{success} = $success;
@@ -148,6 +150,35 @@
     $res->{data} = $new;
 }
 
+sub create_http_request {
+    my ($uri, $method, $params) = @_;
+
+    # NOTE: HTTP::Request::Common::PUT is crap - so we use our own code
+    # borrowed from HTTP::Request::Common::POST
+
+    if  ($method eq 'POST' || $method eq 'PUT') {
+
+	my $req = HTTP::Request->new($method => $uri);
+	$req->header('Content-Type' => 'application/x-www-form-urlencoded'); 
+
+	# We use a temporary URI object to format
+	# the application/x-www-form-urlencoded content.
+	my $url = URI->new('http:');
+	$url->query_form(%$params);
+	my $content = $url->query;
+	if (defined($content)) {
+	    $req->header('Content-Length' => length($content));
+	    $req->content($content);
+	} else {
+	    $req->header('Content-Length' => 0);
+	}
+
+	return $req;
+    }
+
+    die "unknown method '$method'"; 
+}
+
 sub proxy_handler {
     my($r, $host, $method, $abs_uri, $ticket, $params) = @_;
 
@@ -180,10 +211,8 @@
     if ($method eq 'GET') {
 	$uri->query_form($params);
 	$response = $ua->request(HTTP::Request::Common::GET($uri));		    
-    } elsif ($method eq 'POST') {
-	$response = $ua->request(HTTP::Request::Common::POST($uri, Content => $params));
-    } elsif ($method eq 'PUT') {
-	$response = $ua->request(HTTP::Request::Common::PUT($uri, Content => $params));
+    } elsif ($method eq 'POST' || $method eq 'PUT') {
+	$response = $ua->request(create_http_request($uri, $method, $params));
     } elsif ($method eq 'DELETE') {
 	$response = $ua->request(HTTP::Request::Common::DELETE($uri));
     } else {
@@ -192,6 +221,7 @@
 	return $code;
     }
 
+
     if (my $cookie = $response->header("Set-Cookie")) {
 	$r->err_headers_out()->add("Set-Cookie" => $cookie);
     }
@@ -260,7 +290,7 @@
     if (!$handler || !$info) {
 	return {
 	    status => HTTP_NOT_IMPLEMENTED,
-	    message => "Method '$abs_uri' not implemented",
+	    message => "Method '$method $abs_uri' not implemented",
 	};
     }
 
@@ -329,7 +359,8 @@
      $r->status($res->{status} || HTTP_OK);
  
      if ($res->{message}) {
-	 $r->status_line("$res->{status} $res->{message}");
+	 my ($firstline) = $res->{message} =~ m/\A(.*)$/m;
+	 $r->status_line("$res->{status} $firstline");
      }
 
      my ($raw, $ct) = format_response_data($format, $res, $abs_uri);

Modified: pve-manager/pve2/lib/PVE/RESTHandler.pm
===================================================================
--- pve-manager/pve2/lib/PVE/RESTHandler.pm	2010-07-16 12:01:11 UTC (rev 4907)
+++ pve-manager/pve2/lib/PVE/RESTHandler.pm	2010-07-16 15:47:53 UTC (rev 4908)
@@ -99,7 +99,7 @@
     my $func = $info->{name} ? $self->can($info->{name}) : undef;
 
     if (!($info->{name} && $func)) {
-	$resp->{message} = "SERVER ERROR: method lookup failed ('$info->{name}')";
+	$resp->{message} = "Method lookup failed ('$info->{name}')";
 	$resp->{status} = HTTP_INTERNAL_SERVER_ERROR;
 	return $resp->{status};
     }
@@ -109,6 +109,7 @@
 	my $res = PVE::JSONSchema::validate($conn->{params}, $schema);
 	if (!$res->{valid}) {
 	    $resp->{status} = HTTP_BAD_REQUEST;
+	    $resp->{message} = "Parameter verification failed";
 	    $resp->{errors} = $res->{errors},
 	    return $resp->{status};
 	}
@@ -134,7 +135,7 @@
 	my $res = PVE::JSONSchema::validate($resp->{data}, $schema);
 	if (!$res->{valid}) {
 
-	    $resp->{message} = "SERVER ERROR: result verification vailed";
+	    $resp->{message} = "Result verification vailed";
 	    $resp->{status} = HTTP_INTERNAL_SERVER_ERROR;
 	    $resp->{errors} = $res->{errors};
 

Modified: pve-manager/pve2/www/manager/PVEUtils.js
===================================================================
--- pve-manager/pve2/www/manager/PVEUtils.js	2010-07-16 12:01:11 UTC (rev 4907)
+++ pve-manager/pve2/www/manager/PVEUtils.js	2010-07-16 15:47:53 UTC (rev 4908)
@@ -123,14 +123,16 @@
 	format_content_types: function(value) {
 	    var cta = [];
 
-	    if (value.images)
-		cta.push('Images');
-	    if (value.backup)
-		cta.push('Backups');
-	    if (value.vztmpl)
-		cta.push('Templates');
-	    if (value.iso)
-		cta.push('ISO');
+	    Ext.each(value.split(','), function(ct) {
+		if (ct === 'images')
+		    cta.push('Images');
+		if (ct === 'backup')
+		    cta.push('Backups');
+		if (ct === 'vztmpl')
+		    cta.push('Templates');
+		if (ct === 'iso')
+		    cta.push('ISO');
+	    });
 
 	    return cta.join(', ');
 	},

Modified: pve-manager/pve2/www/manager/StorageBrowser.js
===================================================================
--- pve-manager/pve2/www/manager/StorageBrowser.js	2010-07-16 12:01:11 UTC (rev 4907)
+++ pve-manager/pve2/www/manager/StorageBrowser.js	2010-07-16 15:47:53 UTC (rev 4908)
@@ -237,12 +237,14 @@
 	    if (!rec)
 		return;
 
-	    var ct = rec.data.value || {};
+	    var ct = rec.data.value || '';
+	    var cthash = {};
+	    Ext.each(ct.split(','), function(item) { cthash[item] = 1 });
 
-	    cond_view_comp('images', ct.images);
-	    cond_view_comp('iso', ct.iso);
-	    cond_view_comp('vztmpl', ct.vztmpl);
-	    cond_view_comp('backup', ct.backup);
+	    cond_view_comp('images', cthash.images);
+	    cond_view_comp('iso', cthash.iso);
+	    cond_view_comp('vztmpl', cthash.vztmpl);
+	    cond_view_comp('backup', cthash.backup);
 	};
 	
 	if (!store) {
@@ -254,7 +256,7 @@
 		    type: { header: 'Storage Type', renderer: PVE.Utils.format_storage_type },
 		    path: { header: 'Path' },
 		    shared: { header: 'Shared', renderer: PVE.Utils.format_boolean },
-		    disabled: { header: 'Enabled',  renderer: PVE.Utils.format_neg_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/form/ModifyDirStorage.js
===================================================================
--- pve-manager/pve2/www/manager/form/ModifyDirStorage.js	2010-07-16 12:01:11 UTC (rev 4907)
+++ pve-manager/pve2/www/manager/form/ModifyDirStorage.js	2010-07-16 15:47:53 UTC (rev 4908)
@@ -9,26 +9,38 @@
 
 	var items_col1 = [
 	    {
+		xtype: 'hidden',
+		name: 'digest',
+	    },
+	    {
 		xtype: 'textfield',
 		fieldLabel: 'Storage name',
-		name: 'storage'
-		//disabled: true,
-		//allowBlank: false
+		name: 'storage',
+		value: storeid,
+		disabled: true
 	    },
 	    {
 		xtype: 'textfield',
 		fieldLabel: 'Directory',
 		name: 'path',
-		allowBlank: false
+		disabled: true
 	    }
 	];
 
+	var cts = [['images', 'Images']];
+
+	if (storeid === 'local') {
+	    cts.push(['vztmpl', 'OpenVZ Templates']);
+	    cts.push(['iso', 'ISO']);
+	} else {
+	    cts.push(['backup', 'Backup']);
+	} 
+
 	var items_col2 = [
 	    {
 		xtype: 'checkbox',
 		fieldLabel: 'Disabled',
-		name: 'disabled',
-		value: 'test1'
+		name: 'disable'
 	    },
 	    {
 		xtype: 'checkbox',
@@ -41,19 +53,21 @@
 		editable: false,
 		triggerAction: 'all',
 		fieldLabel: 'Content',
-		name: 'content',
+		name: storeid === 'local' ? 'content' : 'hiddencontent',
+		mode: 'local',
 		style : 'margin-bottom:10px',// avoid scrolbars with Firefox
 		width: 150,
 		height: 'auto',
-		store: [['images', 'Images'], ['backup', 'Backup'], 
-			['vztmpl', 'OpenVZ Templates'], ['iso', 'ISO']]
+		store: cts,
+		hiddenName: 'content'
 	    }
 	];
 
 	// 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/test",
+	    url: "/api2/extjs/storage/config/" + storeid,
+	    method: 'PUT',
 
 	    items: {
 		layout:'column',
@@ -78,5 +92,13 @@
 	}));
 
 	PVE.form.ModifyDirStorage.superclass.initComponent.call(self);
+
+	var form = self.getForm();
+
+	form.load({
+	    url: "/api2/extjs/storage/config/" + storeid,
+	    method: 'GET'
+	});
+
     }
 });

Modified: pve-manager/pve2/www/manager/form/StdForm.js
===================================================================
--- pve-manager/pve2/www/manager/form/StdForm.js	2010-07-16 12:01:11 UTC (rev 4907)
+++ pve-manager/pve2/www/manager/form/StdForm.js	2010-07-16 15:47:53 UTC (rev 4908)
@@ -15,16 +15,34 @@
 
 		var form = self.getForm();
 
+		// NOTE: we add parameter for unset checkbox (because html 
+		// does not sent them by default)
+		var params = {};
+		form.items.each(function(f) {
+		    n = f.getName();
+                    val = f.getValue();
+		    xt = f.getXType();
+
+		    if (xt === 'checkbox' && !val) {
+			params[n] = 0;
+		    }
+		});
+ 
 		if(form.isValid()){
 		    self.el.mask('Please wait...', 'x-mask-loading');
 
 		    form.submit({
+			params: params,
 			failure: function(f, resp){
 			    self.el.unmask();
 			    if (Ext.isFunction(options.failure)) {
 				options.failure();
 			    } else {
-				Ext.MessageBox.alert('Failure', "Please try again");
+				var msg = "Please try again";
+				if (resp.result && resp.result.message) {
+				    msg = resp.result.message;
+				} 
+				Ext.MessageBox.alert('Failure', msg);
 			    }
 			},
 			success: function(f, resp){



More information about the pve-devel mailing list