]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/lxc/CreateWizard.js
1 Ext
.define('PVE.lxc.CreateWizard', {
2 extend
: 'PVE.window.Wizard',
3 mixins
: ['Proxmox.Mixin.CBind'],
12 cgroupMode: function(get) {
13 const nodeInfo
= PVE
.data
.ResourceStore
.getNodes().find(
14 node
=> node
.node
=== get('nodename'),
16 return nodeInfo
? nodeInfo
['cgroup-mode'] : 2;
25 subject
: gettext('LXC Container'),
30 title
: gettext('General'),
31 onlineHelp
: 'pct_general',
34 xtype
: 'pveNodeSelector',
37 selectCurNode
: '{!nodename}',
38 preferredValue
: '{nodename}',
43 fieldLabel
: gettext('Node'),
45 onlineValidator
: true,
48 xtype
: 'pveGuestIDSelector',
49 name
: 'vmid', // backend only knows vmid
53 validateExists
: false,
56 xtype
: 'proxmoxtextfield',
60 fieldLabel
: gettext('Hostname'),
65 xtype
: 'proxmoxcheckbox',
69 value
: '{unprivileged}',
71 fieldLabel
: gettext('Unprivileged container'),
74 xtype
: 'proxmoxcheckbox',
76 inputValue
: 'nesting=1',
79 disabled
: '{!unprivileged}',
81 fieldLabel
: gettext('Nesting'),
86 xtype
: 'pvePoolSelector',
87 fieldLabel
: gettext('Resource Pool'),
94 inputType
: 'password',
97 fieldLabel
: gettext('Password'),
100 change: function(f
, value
) {
102 f
.up().down('field[name=confirmpw]').validate();
108 inputType
: 'password',
111 fieldLabel
: gettext('Confirm password'),
114 validator: function(value
) {
115 var pw
= this.up().down('field[name=password]').getValue();
117 return "Passwords do not match!";
124 name
: 'ssh-public-keys',
126 fieldLabel
: gettext('SSH public key(s)'),
128 validator: function(value
) {
129 let pwfield
= this.up().down('field[name=password]');
131 let keys
= value
.indexOf('\n') !== -1 ? value
.split('\n') : [value
];
132 if (keys
.some(key
=> key
!== '' && !PVE
.Parser
.parseSSHKey(key
))) {
133 return "Failed to recognize ssh key";
135 pwfield
.allowBlank
= true;
137 pwfield
.allowBlank
= false;
142 afterRender: function() {
143 if (!window
.FileReader
) {
144 return; // No FileReader support in this browser
146 let cancelEvent
= ev
=> {
148 if (ev
.preventDefault
) {
152 this.inputEl
.on('dragover', cancelEvent
);
153 this.inputEl
.on('dragenter', cancelEvent
);
154 this.inputEl
.on('drop', ev
=> {
156 let files
= ev
.event
.dataTransfer
.files
;
157 PVE
.Utils
.loadSSHKeyFromFile(files
[0], v
=> this.setValue(v
));
162 xtype
: 'pveMultiFileButton',
164 hidden
: !window
.FileReader
,
165 text
: gettext('Load SSH Key File'),
167 change: function(btn
, e
, value
) {
169 let field
= this.up().down('textarea[name=ssh-public-keys]');
170 for (const file
of e
?.target
?.files
?? []) {
171 PVE
.Utils
.loadSSHKeyFromFile(file
, v
=> {
172 let oldValue
= field
.getValue();
173 field
.setValue(oldValue
? `${oldValue}\n${v.trim()}` : v
.trim());
183 xtype
: 'pveTagFieldSet',
191 title
: gettext('Template'),
192 onlineHelp
: 'pct_container_images',
195 xtype
: 'pveStorageSelector',
197 fieldLabel
: gettext('Storage'),
198 storageContent
: 'vztmpl',
203 nodename
: '{nodename}',
207 xtype
: 'pveFileSelector',
209 storageContent
: 'vztmpl',
210 fieldLabel
: gettext('Template'),
212 storage
: '{storage}',
213 nodename
: '{nodename}',
220 xtype
: 'pveMultiMPPanel',
221 title
: gettext('Disks'),
228 xtype
: 'pveLxcCPUInputPanel',
229 title
: gettext('CPU'),
233 xtype
: 'pveLxcMemoryInputPanel',
234 title
: gettext('Memory'),
238 xtype
: 'pveLxcNetworkInputPanel',
239 title
: gettext('Network'),
242 nodename
: '{nodename}',
247 xtype
: 'pveLxcDNSInputPanel',
248 title
: gettext('DNS'),
252 title
: gettext('Confirm'),
265 { header
: 'Key', width
: 150, dataIndex
: 'key' },
266 { header
: 'Value', flex
: 1, dataIndex
: 'value' },
272 xtype
: 'proxmoxcheckbox',
276 boxLabel
: gettext('Start after created'),
280 show: function(panel
) {
281 let wizard
= this.up('window');
282 let kv
= wizard
.getValues();
284 Ext
.Object
.each(kv
, function(key
, value
) {
285 if (key
=== 'delete' || key
=== 'tmplstorage') { // ignore
288 if (key
=== 'password') { // don't show pw
291 data
.push({ key
: key
, value
: value
});
294 let summaryStore
= panel
.down('grid').getStore();
295 summaryStore
.suspendEvents();
296 summaryStore
.removeAll();
297 summaryStore
.add(data
);
299 summaryStore
.resumeEvents();
300 summaryStore
.fireEvent('refresh');
303 onSubmit: function() {
304 let wizard
= this.up('window');
305 let kv
= wizard
.getValues();
308 let nodename
= kv
.nodename
;
310 delete kv
.tmplstorage
;
312 if (!kv
.pool
.length
) {
315 if (!kv
.password
.length
&& kv
['ssh-public-keys']) {
319 Proxmox
.Utils
.API2Request({
320 url
: `/nodes/${nodename}/lxc`,
321 waitMsgTarget
: wizard
,
324 success: function(response
, opts
) {
325 Ext
.create('Proxmox.window.TaskViewer', {
327 upid
: response
.result
.data
,
331 failure
: (response
, opts
) => Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
),