[pve-devel] [PATCH 06/10] snapshot tree : add create_template, delete_template, clone buttons

Alexandre Derumier aderumier at odiso.com
Tue Jan 22 10:14:08 CET 2013


Signed-off-by: Alexandre Derumier <aderumier at odiso.com>
---
 www/manager/qemu/SnapshotTree.js |  155 +++++++++++++++++++++++++++++++++++---
 1 file changed, 146 insertions(+), 9 deletions(-)

diff --git a/www/manager/qemu/SnapshotTree.js b/www/manager/qemu/SnapshotTree.js
index f98c849..9799aef 100644
--- a/www/manager/qemu/SnapshotTree.js
+++ b/www/manager/qemu/SnapshotTree.js
@@ -22,6 +22,7 @@ Ext.define('PVE.qemu.SnapshotTree', {
 
     reload: function(repeat) {
         var me = this;
+	var currentistemplate;
 
 	PVE.Utils.API2Request({
 	    url: '/nodes/' + me.nodename + '/qemu/' + me.vmid + '/snapshot',
@@ -38,15 +39,18 @@ Ext.define('PVE.qemu.SnapshotTree', {
 		Ext.Array.each(response.result.data, function(item) {
 		    item.leaf = true;
 		    item.children = [];
+
+		    var running = item.running ? '-running' : '';
+		    var template = item.template ? '-template' : '';
+
 		    if (item.name === 'current') {
 			digest = item.digest + item.running;
-			if (item.running) {
-			    item.iconCls = 'x-tree-node-computer-running';
-			} else {
-			    item.iconCls = 'x-tree-node-computer';
+	                item.iconCls = 'x-tree-node-computer' + running + template;
+			if(item.template){
+			   currentistemplate = 1;
 			}
 		    } else {
-			item.iconCls = 'x-tree-node-snapshot';
+                        item.iconCls = 'x-tree-node-snapshot' + template;
 		    }
 		    idhash[item.name] = item;
 		});
@@ -78,8 +82,10 @@ Ext.define('PVE.qemu.SnapshotTree', {
             method: 'GET',
             success: function(response, options) {
                 var res = response.result.data;
-		if (res === 1) {
+		if (res === 1 && !currentistemplate) {
 		   Ext.getCmp('snapshotBtn').enable();
+		}else{
+		   Ext.getCmp('snapshotBtn').disable();
 		}
             }
         });
@@ -109,11 +115,28 @@ Ext.define('PVE.qemu.SnapshotTree', {
 		record.data.name !== 'current';
 	};
 
+	var valid_snapshot_delete = function(record) {
+	    return record && record.data && record.data.name &&
+		record.data.name !== 'current' && !record.data.template;
+	};
+
 	var valid_snapshot_rollback = function(record) {
 	    return record && record.data && record.data.name &&
 		record.data.name !== 'current' && !record.data.snapstate;
 	};
 
+	var valid_template = function(record) {
+	    if(record && record.data && record.data.template){
+	        return true;
+	    }else{
+		return false;
+	    }
+	};
+
+	var valid_not_template = function(record) {
+	    return record && record.data && !record.data.template && !record.data.snapstate;
+	};
+
 	var run_editor = function() {
 	    var rec = sm.getSelection()[0];
 	    if (valid_snapshot(rec)) {
@@ -127,6 +150,41 @@ Ext.define('PVE.qemu.SnapshotTree', {
 	    }
 	};
 
+	var run_clone = function() {
+	    var rec = sm.getSelection()[0];
+		var snapname = rec.data.name;
+		var template = rec.data.template;
+
+		var params = { feature: 'clone' };
+		if (snapname && snapname !== 'current') {
+		    params.snapname = snapname;
+		}
+
+		PVE.Utils.API2Request({
+		    waitMsgTarget: me,
+		    url: '/nodes/' + me.nodename + '/qemu/' + me.vmid + '/feature',
+		    params: params,
+		    method: 'GET',
+		    success: function(response, options) {
+			var res = response.result.data;
+			var clonefeature;
+
+			if (res === 1 && template) {
+			    clonefeature = 1;
+			}
+
+			var win = Ext.create('PVE.window.Clone', {
+			    snapname: snapname,
+			    nodename: me.nodename,
+			    vmid: me.vmid,
+			    clonefeature: clonefeature
+			});
+			win.show();
+			me.mon(win, 'close', me.reload, me);
+		    }
+		});
+	};
+
 	var editBtn = new PVE.button.Button({
 	    text: gettext('Edit'),
 	    disabled: true,
@@ -180,7 +238,7 @@ Ext.define('PVE.qemu.SnapshotTree', {
 					    "'" + rec.data.name + "'");
 		return msg;
 	    },
-	    enableFn: valid_snapshot,
+	    enableFn: valid_snapshot_delete,
 	    handler: function(btn, event) {
 		var rec = sm.getSelection()[0];
 		if (!rec) {
@@ -220,15 +278,94 @@ Ext.define('PVE.qemu.SnapshotTree', {
 	    }
 	});
 
+
+	var templateBtn = new PVE.button.Button({
+	    text: gettext('Create Template'),
+	    enableFn: valid_not_template,
+	    disabled: true,
+	    selModel: sm,
+            handler: function(btn, event) {
+                var rec = sm.getSelection()[0];
+                if (!rec) {
+                    return;
+                }
+		var params = {};
+
+                if (rec.data.name && rec.data.name !== 'current') {
+                    params.snapname = rec.data.name;
+                }
+
+                PVE.Utils.API2Request({
+                    url: '/nodes/' + me.nodename + '/qemu/' + me.vmid + '/template',
+                    params: params,
+                    method: 'POST',
+                    waitMsgTarget: me,
+                    callback: function() {
+                        me.reload();
+                    },
+                    failure: function (response, opts) {
+                        Ext.Msg.alert(gettext('Error'), response.htmlStatus);
+                    },
+                    success: function(response, options) {
+                        //win.show();
+                    }
+                });
+            }
+
+	});
+
+	var templatedeleteBtn = new PVE.button.Button({
+	    text: gettext('Delete Template'),
+	    disabled: true,
+	    selModel: sm,
+	    enableFn: valid_template,
+            handler: function(btn, event) {
+                var rec = sm.getSelection()[0];
+                if (!rec) {
+                    return;
+                }
+		var params = { delete:1 };
+
+                if (rec.data.name && rec.data.name !== 'current') {
+                    params.snapname = rec.data.name;
+                }
+
+                PVE.Utils.API2Request({
+                    url: '/nodes/' + me.nodename + '/qemu/' + me.vmid + '/template',
+                    params: params,
+                    method: 'POST',
+                    waitMsgTarget: me,
+                    callback: function() {
+                        me.reload();
+                    },
+                    failure: function (response, opts) {
+                        Ext.Msg.alert(gettext('Error'), response.htmlStatus);
+                    },
+                    success: function(response, options) {
+                        //win.show();
+                    }
+                });
+            }
+
+	});
+
+	var cloneBtn = new PVE.button.Button({
+	    text: gettext('Clone'),
+	    disabled: false,
+	    selModel: sm,
+	    handler: run_clone
+	});
+
+
 	Ext.apply(me, {
 	    layout: 'fit',
 	    rootVisible: false,
 	    animate: false,
 	    sortableColumns: false,
 	    selModel: sm,
-	    tbar: [ snapshotBtn, rollbackBtn, removeBtn, editBtn ],
+	    tbar: [ snapshotBtn, rollbackBtn, removeBtn, editBtn, templateBtn, templatedeleteBtn, cloneBtn ],
 	    fields: [ 
-		'name', 'description', 'snapstate', 'vmstate', 'running',
+		'name', 'description', 'snapstate', 'vmstate', 'running', 'template',
 		{ name: 'snaptime', type: 'date', dateFormat: 'timestamp' }
 	    ],
 	    columns: [
-- 
1.7.10.4




More information about the pve-devel mailing list