]> git.proxmox.com Git - pve-manager.git/blob - www/manager6/qemu/MachineEdit.js
ui: qemu: clarify that the intel vIOMMU is compatible with AMD
[pve-manager.git] / www / manager6 / qemu / MachineEdit.js
1 Ext.define('PVE.qemu.MachineInputPanel', {
2 extend: 'Proxmox.panel.InputPanel',
3 xtype: 'pveMachineInputPanel',
4 onlineHelp: 'qm_machine_type',
5
6 viewModel: {
7 data: {
8 type: '__default__',
9 },
10 formulas: {
11 q35: get => get('type') === 'q35',
12 },
13 },
14
15 controller: {
16 xclass: 'Ext.app.ViewController',
17 control: {
18 'combobox[name=machine]': {
19 change: 'onMachineChange',
20 },
21 },
22 onMachineChange: function(field, value) {
23 let me = this;
24 let version = me.lookup('version');
25 let store = version.getStore();
26 let oldRec = store.findRecord('id', version.getValue(), 0, false, false, true);
27 let type = value === 'q35' ? 'q35' : 'i440fx';
28 store.clearFilter();
29 store.addFilter(val => val.data.id === 'latest' || val.data.type === type);
30 if (!me.getView().isWindows) {
31 version.setValue('latest');
32 } else {
33 store.isWindows = true;
34 if (!oldRec) {
35 return;
36 }
37 let oldVers = oldRec.data.version;
38 // we already filtered by correct type, so just check version property
39 let rec = store.findRecord('version', oldVers, 0, false, false, true);
40 if (rec) {
41 version.select(rec);
42 }
43 }
44 },
45 },
46
47 onGetValues: function(values) {
48 if (values.delete === 'machine' && values.viommu) {
49 delete values.delete;
50 values.machine = 'pc';
51 }
52 if (values.version && values.version !== 'latest') {
53 values.machine = values.version;
54 delete values.delete;
55 }
56 delete values.version;
57 if (values.delete === 'machine' && !values.viommu) {
58 return values;
59 }
60 let ret = {};
61 ret.machine = PVE.Parser.printPropertyString(values, 'machine');
62 return ret;
63 },
64
65 setValues: function(values) {
66 let me = this;
67
68 let machineConf = PVE.Parser.parsePropertyString(values.machine, 'type');
69 values.machine = machineConf.type;
70
71 me.isWindows = values.isWindows;
72 if (values.machine === 'pc') {
73 values.machine = '__default__';
74 }
75
76 if (me.isWindows) {
77 if (values.machine === '__default__') {
78 values.version = 'pc-i440fx-5.1';
79 } else if (values.machine === 'q35') {
80 values.version = 'pc-q35-5.1';
81 }
82 }
83
84 values.viommu = machineConf.viommu || '__default__';
85
86 if (values.machine !== '__default__' && values.machine !== 'q35') {
87 values.version = values.machine;
88 values.machine = values.version.match(/q35/) ? 'q35' : '__default__';
89
90 // avoid hiding a pinned version
91 me.setAdvancedVisible(true);
92 }
93
94 this.callParent(arguments);
95 },
96
97 items: {
98 xtype: 'proxmoxKVComboBox',
99 name: 'machine',
100 reference: 'machine',
101 fieldLabel: gettext('Machine'),
102 comboItems: [
103 ['__default__', PVE.Utils.render_qemu_machine('')],
104 ['q35', 'q35'],
105 ],
106 bind: {
107 value: '{type}',
108 },
109 },
110
111 advancedItems: [
112 {
113 xtype: 'combobox',
114 name: 'version',
115 reference: 'version',
116 fieldLabel: gettext('Version'),
117 emptyText: gettext('Latest'),
118 value: 'latest',
119 editable: false,
120 valueField: 'id',
121 displayField: 'version',
122 queryParam: false,
123 store: {
124 autoLoad: true,
125 fields: ['id', 'type', 'version'],
126 proxy: {
127 type: 'proxmox',
128 url: "/api2/json/nodes/localhost/capabilities/qemu/machines",
129 },
130 listeners: {
131 load: function(records) {
132 if (!this.isWindows) {
133 this.insert(0, { id: 'latest', type: 'any', version: gettext('Latest') });
134 }
135 },
136 },
137 },
138 },
139 {
140 xtype: 'displayfield',
141 fieldLabel: gettext('Note'),
142 value: gettext('Machine version change may affect hardware layout and settings in the guest OS.'),
143 },
144 {
145 xtype: 'proxmoxKVComboBox',
146 name: 'viommu',
147 fieldLabel: gettext('vIOMMU'),
148 reference: 'viommu-q35',
149 deleteEmpty: false,
150 value: '__default__',
151 comboItems: [
152 ['__default__', Proxmox.Utils.defaultText + ' (None)'],
153 ['intel', gettext('Intel (AMD Compatible)')],
154 ['virtio', 'VirtIO'],
155 ],
156 bind: {
157 hidden: '{!q35}',
158 disabled: '{!q35}',
159 },
160 },
161 {
162 xtype: 'proxmoxKVComboBox',
163 name: 'viommu',
164 fieldLabel: gettext('vIOMMU'),
165 reference: 'viommu-i440fx',
166 deleteEmpty: false,
167 value: '__default__',
168 comboItems: [
169 ['__default__', Proxmox.Utils.defaultText + ' (None)'],
170 ['virtio', 'VirtIO'],
171 ],
172 bind: {
173 hidden: '{q35}',
174 disabled: '{q35}',
175 },
176 },
177 ],
178 });
179
180 Ext.define('PVE.qemu.MachineEdit', {
181 extend: 'Proxmox.window.Edit',
182
183 subject: gettext('Machine'),
184
185 items: {
186 xtype: 'pveMachineInputPanel',
187 },
188
189 width: 400,
190
191 initComponent: function() {
192 let me = this;
193
194 me.callParent();
195
196 me.load({
197 success: function(response) {
198 let conf = response.result.data;
199 let values = {
200 machine: conf.machine || '__default__',
201 };
202 values.isWindows = PVE.Utils.is_windows(conf.ostype);
203 me.setValues(values);
204 },
205 });
206 },
207 });