-// fixme: howto avoid jslint type confusion?
/*jslint confusion: true */
+/* 'change' property is assigned a string and then a function */
Ext.define('PVE.qemu.HDInputPanel', {
extend: 'PVE.panel.InputPanel',
- alias: 'widget.PVE.qemu.HDInputPanel',
+ alias: 'widget.pveQemuHDInputPanel',
onlineHelp: 'qm_hard_disk',
insideWizard: false,
onControllerChange: function(field) {
var value = field.getValue();
- this.lookup('iothread').setDisabled(!value.match(/^(virtio|scsi)/));
+
+ var allowIOthread = value.match(/^(virtio|scsi)/);
+ this.lookup('iothread').setDisabled(!allowIOthread);
+ if (!allowIOthread) {
+ this.lookup('iothread').setValue(false);
+ }
+
+ var scsi = value.match(/^scsi/);
+ this.lookup('discard').setDisabled(!scsi);
+ if (!scsi) {
+ this.lookup('discard').setValue(false);
+ }
+ this.lookup('scsiController').setVisible(scsi);
},
control: {
change: 'onControllerChange',
afterrender: 'onControllerChange'
},
- 'field[name=hdstorage]': {
+ 'field[name=iothread]' : {
change: function(f, value) {
- if (!value) { // initial store loading fires an unwanted 'change'
+ if (!this.getView().insideWizard) {
return;
}
- var me = this.getView();
- var rec = f.store.getById(value);
- if (rec.data.type === 'iscsi') {
- me.hdfilesel.setStorage(value);
- me.hdfilesel.setDisabled(false);
- me.formatsel.setValue('raw');
- me.formatsel.setDisabled(true);
- me.hdfilesel.setVisible(true);
- me.hdsizesel.setDisabled(true);
- me.hdsizesel.setVisible(false);
- } else if (rec.data.type === 'lvm' ||
- rec.data.type === 'lvmthin' ||
- rec.data.type === 'drbd' ||
- rec.data.type === 'rbd' ||
- rec.data.type === 'sheepdog' ||
- rec.data.type === 'zfs' ||
- rec.data.type === 'zfspool') {
- me.hdfilesel.setDisabled(true);
- me.hdfilesel.setVisible(false);
- me.formatsel.setValue('raw');
- me.formatsel.setDisabled(true);
- me.hdsizesel.setDisabled(false);
- me.hdsizesel.setVisible(true);
- } else {
- me.hdfilesel.setDisabled(true);
- me.hdfilesel.setVisible(false);
- me.formatsel.setValue('qcow2');
- me.formatsel.setDisabled(false);
- me.hdsizesel.setDisabled(false);
- me.hdsizesel.setVisible(true);
- }
+ var vmScsiType = value ? 'virtio-scsi-single': 'virtio-scsi-pci';
+ this.lookupReference('scsiController').setValue(vmScsiType);
}
}
}
onGetValues: function(values) {
var me = this;
+ var params = {};
var confid = me.confid || (values.controller + values.deviceid);
-
+
if (me.unused) {
me.drive.file = me.vmconfig[values.unusedId];
confid = values.controller + values.deviceid;
- } else if (me.create) {
+ } else if (me.isCreate) {
if (values.hdimage) {
me.drive.file = values.hdimage;
} else {
}
me.drive.format = values.diskformat;
}
-
+
if (values.nobackup) {
me.drive.backup = 'no';
} else {
delete me.drive.backup;
}
+ if (values.noreplicate) {
+ me.drive.replicate = 'no';
+ } else {
+ delete me.drive.replicate;
+ }
+
if (values.discard) {
me.drive.discard = 'on';
} else {
delete me.drive.discard;
}
- if (values.iothread && confid.match(/^(virtio|scsi)\d+$/)) {
+ if (values.iothread) {
me.drive.iothread = 'on';
} else {
delete me.drive.iothread;
delete me.drive.cache;
}
- var params = {};
-
+ if (values.scsihw) {
+ params.scsihw = values.scsihw;
+ }
+
params[confid] = PVE.Parser.printQemuDrive(me.drive);
-
- return params;
+
+ return params;
},
setVMConfig: function(vmconfig) {
me.vmconfig = vmconfig;
if (me.bussel) {
- me.bussel.setVMConfig(vmconfig, true);
+ me.bussel.setVMConfig(vmconfig);
+ me.scsiController.setValue(vmconfig.scsihw);
}
if (me.unusedDisks) {
- var disklist = [];
+ var disklist = [];
Ext.Object.each(vmconfig, function(key, value) {
if (key.match(/^unused\d+$/)) {
disklist.push([key, value]);
values.hdimage = drive.file;
values.nobackup = !PVE.Parser.parseBoolean(drive.backup, 1);
+ values.noreplicate = !PVE.Parser.parseBoolean(drive.replicate, 1);
values.diskformat = drive.format || 'raw';
values.cache = drive.cache || '__default__';
values.discard = (drive.discard === 'on');
setNodename: function(nodename) {
var me = this;
- me.hdstoragesel.setNodename(nodename);
- me.hdfilesel.setStorage(undefined, nodename);
+ me.down('#hdstorage').setNodename(nodename);
+ me.down('#hdimage').setStorage(undefined, nodename);
},
initComponent : function() {
vmconfig: me.insideWizard ? {ide2: 'cdrom'} : {}
});
me.column1.push(me.bussel);
+
+ me.scsiController = Ext.create('Ext.form.field.Display', {
+ name: 'scsihw',
+ fieldLabel: gettext('SCSI Controller'),
+ reference: 'scsiController',
+ renderer: PVE.Utils.render_scsihw,
+ // do not change a VM wide option after creation
+ submitValue: me.insideWizard,
+ hidden: true
+ });
+ me.column1.push(me.scsiController);
}
if (me.unused) {
me.unusedDisks = Ext.create('PVE.form.KVComboBox', {
- name: 'unusedId',
+ name: 'unusedId',
fieldLabel: gettext('Disk image'),
matchFieldWidth: false,
listConfig: {
allowBlank: false
});
me.column1.push(me.unusedDisks);
- } else if (me.create) {
- me.formatsel = Ext.create('PVE.form.DiskFormatSelector', {
- name: 'diskformat',
- fieldLabel: gettext('Format'),
- value: 'qcow2',
- allowBlank: false
- });
-
- me.hdfilesel = Ext.create('PVE.form.FileSelector', {
- name: 'hdimage',
- nodename: me.nodename,
+ } else if (me.isCreate) {
+ me.column1.push({
+ xtype: 'pveDiskStorageSelector',
storageContent: 'images',
- fieldLabel: gettext('Disk image'),
- disabled: true,
- hidden: true,
- allowBlank: false
- });
-
- me.hdsizesel = Ext.createWidget('numberfield', {
- name: 'disksize',
- minValue: 0.001,
- maxValue: 128*1024,
- decimalPrecision: 3,
- value: '32',
- fieldLabel: gettext('Disk size') + ' (GB)',
- allowBlank: false
- });
-
- me.hdstoragesel = Ext.create('PVE.form.StorageSelector', {
- name: 'hdstorage',
+ name: 'disk',
nodename: me.nodename,
- fieldLabel: gettext('Storage'),
- storageContent: 'images',
- autoSelect: me.insideWizard,
- allowBlank: false
+ autoSelect: me.insideWizard
});
- me.column1.push(me.hdstoragesel);
- me.column1.push(me.hdfilesel);
- me.column1.push(me.hdsizesel);
- me.column1.push(me.formatsel);
-
} else {
me.column1.push({
xtype: 'textfield',
name: 'cache',
value: '__default__',
fieldLabel: gettext('Cache')
- });
-
- me.column2.push({
- xtype: 'pvecheckbox',
+ },
+ {
+ xtype: 'proxmoxcheckbox',
fieldLabel: gettext('No backup'),
name: 'nobackup'
- });
-
- me.column2.push({
- xtype: 'pvecheckbox',
+ },
+ {
+ xtype: 'proxmoxcheckbox',
+ hidden: me.insideWizard,
+ fieldLabel: gettext('Skip replication'),
+ name: 'noreplicate'
+ },
+ {
+ xtype: 'proxmoxcheckbox',
fieldLabel: gettext('Discard'),
+ disabled: me.confid && !me.confid.match(/^scsi/),
+ reference: 'discard',
name: 'discard'
- });
-
- me.column2.push({
- xtype: 'pvecheckbox',
- disabled: me.insideWizard || (me.confid && !me.confid.match(/^(virtio|scsi)/)),
- fieldLabel: gettext('IO thread'),
+ },
+ {
+ xtype: 'proxmoxcheckbox',
+ disabled: me.confid && !me.confid.match(/^(virtio|scsi)/),
+ fieldLabel: 'IO thread',
reference: 'iothread',
name: 'iothread'
});
me.callParent();
}
});
+/*jslint confusion: false */
Ext.define('PVE.qemu.HDEdit', {
extend: 'PVE.window.Edit',
var me = this;
var nodename = me.pveSelNode.data.node;
- if (!nodename) {
- throw "no node name specified";
+ if (!nodename) {
+ throw "no node name specified";
}
var unused = me.confid && me.confid.match(/^unused\d+$/);
- me.create = me.confid ? unused : true;
+ me.isCreate = me.confid ? unused : true;
var ipanel = Ext.create('PVE.qemu.HDInputPanel', {
confid: me.confid,
nodename: nodename,
unused: unused,
- create: me.create
+ isCreate: me.isCreate
});
var subject;
if (unused) {
me.subject = gettext('Unused Disk');
- } else if (me.create) {
+ } else if (me.isCreate) {
me.subject = gettext('Hard Disk');
} else {
me.subject = gettext('Hard Disk') + ' (' + me.confid + ')';
me.items = [ ipanel ];
me.callParent();
-
+ /*jslint confusion: true*/
+ /* 'data' is assigned an empty array in same file, and here we
+ * use it like an object
+ */
me.load({
success: function(response, options) {
ipanel.setVMConfig(response.result.data);
}
}
});
+ /*jslint confusion: false*/
}
});