-/*jslint confusion: true*/
Ext.define('PVE.qemu.CreateWizard', {
extend: 'PVE.window.Wizard',
alias: 'widget.pveQemuCreateWizard',
viewModel: {
data: {
- nodename: ''
- }
+ nodename: '',
+ current: {
+ scsihw: '',
+ },
+ },
+ formulas: {
+ cgroupMode: function(get) {
+ const nodeInfo = PVE.data.ResourceStore.getNodes().find(
+ node => node.node === get('nodename'),
+ );
+ return nodeInfo ? nodeInfo['cgroup-mode'] : 2;
+ },
+ },
},
cbindData: {
- nodename: undefined
+ nodename: undefined,
},
subject: gettext('Virtual Machine'),
+ // fot the special case that we have 2 cdrom drives
+ //
+ // emulates part of the backend bootorder logic, but includes all
+ // cdrom drives since we don't know which one the user put in a bootable iso
+ // and hardcodes the known values (ide0/2, net0)
+ calculateBootOrder: function(values) {
+ // user selected windows + second cdrom
+ if (values.ide0 && values.ide0.match(/media=cdrom/)) {
+ let disk;
+ PVE.Utils.forEachBus(['ide', 'scsi', 'virtio', 'sata'], (type, id) => {
+ let confId = type + id;
+ if (!values[confId]) {
+ return undefined;
+ }
+ if (values[confId].match(/media=cdrom/)) {
+ return undefined;
+ }
+ disk = confId;
+ return false; // abort loop
+ });
+
+ let order = [];
+ if (disk) {
+ order.push(disk);
+ }
+ order.push('ide0', 'ide2');
+ if (values.net0) {
+ order.push('net0');
+ }
+
+ return `order=${order.join(';')}`;
+ }
+ return undefined;
+ },
+
items: [
{
xtype: 'inputpanel',
name: 'nodename',
cbind: {
selectCurNode: '{!nodename}',
- preferredValue: '{nodename}'
+ preferredValue: '{nodename}',
},
bind: {
- value: '{nodename}'
+ value: '{nodename}',
},
fieldLabel: gettext('Node'),
allowBlank: false,
- onlineValidator: true
+ onlineValidator: true,
},
{
xtype: 'pveGuestIDSelector',
guestType: 'qemu',
value: '',
loadNextFreeID: true,
- validateExists: false
+ validateExists: false,
},
{
xtype: 'textfield',
vtype: 'DnsName',
value: '',
fieldLabel: gettext('Name'),
- allowBlank: true
- }
+ allowBlank: true,
+ },
],
column2: [
{
fieldLabel: gettext('Resource Pool'),
name: 'pool',
value: '',
- allowBlank: true
- }
+ allowBlank: true,
+ },
],
advancedColumn1: [
{
uncheckedValue: 0,
defaultValue: 0,
deleteDefaultValue: true,
- fieldLabel: gettext('Start at boot')
+ fieldLabel: gettext('Start at boot'),
},
- {
- xtype: 'proxmoxcheckbox',
- name: 'agent',
- uncheckedValue: 0,
- defaultValue: 0,
- deleteDefaultValue: true,
- fieldLabel: gettext('Qemu Agent')
- }
],
advancedColumn2: [
{
defaultValue: '',
emptyText: 'any',
labelWidth: 120,
- fieldLabel: gettext('Start/Shutdown order')
+ fieldLabel: gettext('Start/Shutdown order'),
},
{
xtype: 'textfield',
defaultValue: '',
emptyText: 'default',
labelWidth: 120,
- fieldLabel: gettext('Startup delay')
+ fieldLabel: gettext('Startup delay'),
},
{
xtype: 'textfield',
defaultValue: '',
emptyText: 'default',
labelWidth: 120,
- fieldLabel: gettext('Shutdown timeout')
- }
+ fieldLabel: gettext('Shutdown timeout'),
+ },
+ ],
+
+ advancedColumnB: [
+ {
+ xtype: 'pveTagFieldSet',
+ name: 'tags',
+ maxHeight: 150,
+ },
],
- onGetValues: function(values) {
+ onGetValues: function(values) {
['name', 'pool', 'onboot', 'agent'].forEach(function(field) {
if (!values[field]) {
delete values[field];
var res = PVE.Parser.printStartup({
order: values.order,
up: values.up,
- down: values.down
+ down: values.down,
});
if (res) {
delete values.down;
return values;
- }
+ },
},
{
xtype: 'container',
layout: 'hbox',
defaults: {
flex: 1,
- padding: '0 10'
+ padding: '0 10',
},
title: gettext('OS'),
items: [
{
xtype: 'pveQemuCDInputPanel',
bind: {
- nodename: '{nodename}'
+ nodename: '{nodename}',
},
confid: 'ide2',
- insideWizard: true
+ insideWizard: true,
},
{
xtype: 'pveQemuOSTypePanel',
- insideWizard: true
- }
- ]
+ insideWizard: true,
+ bind: {
+ nodename: '{nodename}',
+ },
+ },
+ ],
+ },
+ {
+ xtype: 'pveQemuSystemPanel',
+ title: gettext('System'),
+ isCreate: true,
+ insideWizard: true,
},
{
- xtype: 'pveQemuHDInputPanel',
+ xtype: 'pveMultiHDPanel',
bind: {
- nodename: '{nodename}'
+ nodename: '{nodename}',
},
- title: gettext('Hard Disk'),
- isCreate: true,
- insideWizard: true
+ title: gettext('Disks'),
},
{
xtype: 'pveQemuProcessorPanel',
insideWizard: true,
- title: gettext('CPU')
+ title: gettext('CPU'),
},
{
xtype: 'pveQemuMemoryPanel',
insideWizard: true,
- title: gettext('Memory')
+ title: gettext('Memory'),
},
{
xtype: 'pveQemuNetworkInputPanel',
bind: {
- nodename: '{nodename}'
+ nodename: '{nodename}',
},
title: gettext('Network'),
- insideWizard: true
+ insideWizard: true,
},
{
title: gettext('Confirm'),
store: {
model: 'KeyValue',
sorters: [{
- property : 'key',
- direction: 'ASC'
- }]
+ property: 'key',
+ direction: 'ASC',
+ }],
},
columns: [
- {header: 'Key', width: 150, dataIndex: 'key'},
- {header: 'Value', flex: 1, dataIndex: 'value'}
- ]
- }
+ { header: 'Key', width: 150, dataIndex: 'key' },
+ { header: 'Value', flex: 1, dataIndex: 'value' },
+ ],
+ },
],
dockedItems: [
{
name: 'start',
dock: 'bottom',
margin: '5 0 0 0',
- boxLabel: gettext('Start after created')
- }
+ boxLabel: gettext('Start after created'),
+ },
],
listeners: {
show: function(panel) {
- var kv = this.up('window').getValues();
+ let wizard = this.up('window');
+ var kv = wizard.getValues();
var data = [];
+
+ let boot = wizard.calculateBootOrder(kv);
+ if (boot) {
+ kv.boot = boot;
+ }
+
Ext.Object.each(kv, function(key, value) {
if (key === 'delete') { // ignore
return;
summarystore.sort();
summarystore.resumeEvents();
summarystore.fireEvent('refresh');
-
- }
+ },
},
onSubmit: function() {
var wizard = this.up('window');
var kv = wizard.getValues();
- delete kv['delete'];
+ delete kv.delete;
var nodename = kv.nodename;
delete kv.nodename;
+ let boot = wizard.calculateBootOrder(kv);
+ if (boot) {
+ kv.boot = boot;
+ }
+
Proxmox.Utils.API2Request({
url: '/nodes/' + nodename + '/qemu',
waitMsgTarget: wizard,
method: 'POST',
params: kv,
- success: function(response){
+ success: function(response) {
wizard.close();
},
failure: function(response, opts) {
Ext.Msg.alert(gettext('Error'), response.htmlStatus);
- }
+ },
});
- }
- }
- ]
+ },
+ },
+ ],
});
-
-