we need to change memory field step dynamically, and also map values to dimm 
size.

Fixme : apply same behaviour for maxmemory field

Signed-off-by: Alexandre Derumier <aderum...@odiso.com>
---
 www/manager/qemu/HardwareView.js |    4 ++
 www/manager/qemu/MemoryEdit.js   |  112 +++++++++++++++++++++++++++++++++++---
 2 files changed, 107 insertions(+), 9 deletions(-)

diff --git a/www/manager/qemu/HardwareView.js b/www/manager/qemu/HardwareView.js
index 99a7157..ba986c4 100644
--- a/www/manager/qemu/HardwareView.js
+++ b/www/manager/qemu/HardwareView.js
@@ -111,6 +111,9 @@ Ext.define('PVE.qemu.HardwareView', {
            },
            balloon: {
                visible: false
+           },
+           hotplug: {
+               visible: false
            }
        };
 
@@ -216,6 +219,7 @@ Ext.define('PVE.qemu.HardwareView', {
            var win = Ext.create(editor, {
                pveSelNode: me.pveSelNode,
                confid: rec.data.key,
+               hotplug: me.getObjectValue('hotplug'),
                url: '/api2/extjs/' + baseurl
            });
 
diff --git a/www/manager/qemu/MemoryEdit.js b/www/manager/qemu/MemoryEdit.js
index 2ed6bb0..3bad580 100644
--- a/www/manager/qemu/MemoryEdit.js
+++ b/www/manager/qemu/MemoryEdit.js
@@ -29,9 +29,10 @@ Ext.define('PVE.qemu.MemoryInputPanel', {
 
     initComponent : function() {
        var me = this;
-
        var labelWidth = 160;
 
+       var hotplug = me.hotplug;
+
        var items = [
            {
                xtype: 'radiofield',
@@ -55,13 +56,94 @@ Ext.define('PVE.qemu.MemoryInputPanel', {
                xtype: 'numberfield',
                name: 'memory',
                minValue: 32,
-               maxValue: 512*1024,
+               maxValue: 4096*1024,
                value: '512',
                step: 32,
                fieldLabel: gettext('Memory') + ' (MB)',
                labelAlign: 'right',
                labelWidth: labelWidth,
-               allowBlank: false
+               allowBlank: false,
+               listeners: {
+                    change: function(f, value, oldvalue) {
+                       var me = this;
+
+                       if(!hotplug) {
+                           return;
+                       }
+
+                       //fill an array with dimms size
+                       var dimmarray = new Array (255);
+                       var dimm_size = 512;
+                       var current_size = 1024;
+                       var i;
+                       var j;
+                       var dimm_id = 0;
+                       for (j = 0; j < 8; j++) {
+                           for (i = 0; i < 32; i++) {
+                               dimmarray[dimm_id] = current_size;
+                               current_size += dimm_size;                      
        
+                               dimm_id++;
+                           }
+                           dimm_size *= 2;
+                       }
+                       //find nearest value in array
+                       var k = 0, closest, closestDiff, currentDiff
+                       closest = dimmarray[0];
+                       for(k; k < dimmarray.length;k++) {
+                           closestDiff = Math.abs(value - closest);
+                           currentDiff = Math.abs(value - dimmarray[k]);
+                           if(currentDiff < closestDiff) {
+                               closest = dimmarray[k];
+                           }
+                           closestDiff = null;
+                           currentDiff = null;
+                       }
+                       if(value != closest){
+                           value = closest;
+                       }
+                       f.setValue(value);
+
+                       //dynamic step
+                       if(value > oldvalue) {
+                           if(value < 16384) {
+                               me.step = 512;
+                           } else if(value >= 16384 && value < 49152) {
+                               me.step = 1024;
+                           } else if (value >= 49152 && value < 114688) {
+                               me.step = 2048;
+                           } else if (value >= 114688 && value < 245760) {
+                               me.step = 4096;
+                           } else if (value >= 245760 && value < 507904) {
+                               me.step = 8192;
+                           } else if (value >= 507904 && value < 1032192) {
+                               me.step = 16384;
+                           } else if (value >= 1032192 && value < 2080768) {
+                               me.step = 32768;
+                           } else if (value >= 2080768 && value < 4177920) {
+                               me.step = 65536;
+                           }
+                       } else if (value < oldvalue) {
+                           if(value <= 16384) {
+                               me.step = 512;
+                           } else if(value > 16384 && value <= 49152) {
+                               me.step = 1024;
+                           } else if (value > 49152 && value <= 114688) {
+                               me.step = 2048;
+                           } else if (value > 114688 && value <= 245760) {
+                               me.step = 4096;
+                           } else if (value > 245760 && value <= 507904) {
+                               me.step = 8192;
+                           } else if (value > 507904 && value <= 1032192) {
+                               me.step = 16384;
+                           } else if (value > 1032192 && value <= 2080768) {
+                               me.step = 32768;
+                           } else if (value > 2080768 && value <= 4177920) {
+                               me.step = 65536;
+                           }
+                       }
+                    }
+                }
+
            },
            {
                xtype: 'radiofield',
@@ -126,7 +208,7 @@ Ext.define('PVE.qemu.MemoryInputPanel', {
                allowBlank: true,
                emptyText: PVE.Utils.defaultText + ' (1000)',
                submitEmptyText: false
-           }
+           },
        ];
 
        if (me.insideWizard) {
@@ -144,10 +226,23 @@ Ext.define('PVE.qemu.MemoryEdit', {
 
     initComponent : function() {
        var me = this;
+
+       var memoryhotplug;
+       if(me.hotplug) {
+           Ext.each(me.hotplug.split(','), function(el) {
+               if (el === 'memory') {
+                   memoryhotplug = 1;
+               }
+           });
+       }
        
+        var ipanel = Ext.create('PVE.qemu.MemoryInputPanel', {
+            hotplug: memoryhotplug,
+        });
+
        Ext.apply(me, {
            subject: gettext('Memory'),
-           items: [ Ext.create('PVE.qemu.MemoryInputPanel') ],
+           items: ipanel,
            // uncomment the following to use the async configiguration API
            // backgroundDelay: 5, 
            width: 400
@@ -164,11 +259,10 @@ Ext.define('PVE.qemu.MemoryEdit', {
                    maxmemory: data.memory,
                    balloon: data.balloon,
                    shares: data.shares,
-                   memoryType: data.balloon ? 'dynamic' : 'fixed'
+                   memoryType: data.balloon ? 'dynamic' : 'fixed',
                };
-
-               me.setValues(values);
+               ipanel.setValues(values);
            }
        });
     }
-});
\ No newline at end of file
+});
-- 
1.7.10.4

_______________________________________________
pve-devel mailing list
pve-devel@pve.proxmox.com
http://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to