]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/lxc/CreateWizard.js
5 Ext
.define('PVE.lxc.CreateWizard', {
6 extend
: 'PVE.window.Wizard',
8 loadSSHKeyFromFile: function(file
) {
10 // ssh-keygen produces 740 bytes for an average 4096 bit rsa key, with
11 // a user@host comment, 1420 for 8192 bits; current max is 16kbit
12 // assume: 740*8 for max. 32kbit (5920 byte file)
13 // round upwards to nearest nice number => 8192 bytes, leaves lots of comment space
14 if (file
.size
> 8192) {
15 Ext
.Msg
.alert(gettext('Error'), gettext("Invalid file size: ") + file
.size
);
18 var reader
= new FileReader();
19 reader
.onload = function(evt
) {
20 me
.sshkeyfield
.setValue(evt
.target
.result
);
22 reader
.readAsText(file
);
25 initComponent: function() {
28 var summarystore
= Ext
.create('Ext.data.Store', {
38 var tmplsel
= Ext
.create('PVE.form.FileSelector', {
40 storageContent
: 'vztmpl',
41 fieldLabel
: gettext('Template'),
45 var tmplstoragesel
= Ext
.create('PVE.form.StorageSelector', {
47 fieldLabel
: gettext('Storage'),
48 storageContent
: 'vztmpl',
52 change: function(f
, value
) {
53 tmplsel
.setStorage(value
);
58 var rootfspanel
= Ext
.create('PVE.lxc.MountPointInputPanel', {
59 title
: gettext('Root Disk'),
67 var networkpanel
= Ext
.create('PVE.lxc.NetworkInputPanel', {
68 title
: gettext('Network'),
74 var passwordfield
= Ext
.createWidget('textfield', {
75 inputType
: 'password',
78 fieldLabel
: gettext('Password'),
81 change: function(f
, value
) {
85 me
.down('field[name=confirmpw]').validate();
89 /*jslint confusion: true */
90 /* the validator function can return either a string or a boolean */
91 me
.sshkeyfield
= Ext
.createWidget('proxmoxtextfield', {
92 name
: 'ssh-public-keys',
94 fieldLabel
: gettext('SSH public key'),
96 validator: function(value
) {
98 var key
= PVE
.Parser
.parseSSHKey(value
);
100 return "Failed to recognize ssh key";
102 me
.down('field[name=password]').allowBlank
= true;
104 me
.down('field[name=password]').allowBlank
= false;
106 me
.down('field[name=password]').validate();
109 afterRender: function() {
110 if (!window
.FileReader
) {
111 // No FileReader support in this browser
114 var cancel = function(ev
) {
116 if (ev
.preventDefault
) {
120 me
.sshkeyfield
.inputEl
.on('dragover', cancel
);
121 me
.sshkeyfield
.inputEl
.on('dragenter', cancel
);
122 me
.sshkeyfield
.inputEl
.on('drop', function(ev
) {
124 if (ev
.preventDefault
) {
127 var files
= ev
.dataTransfer
.files
;
128 me
.loadSSHKeyFromFile(files
[0]);
135 xtype
: 'pvePoolSelector',
136 fieldLabel
: gettext('Resource Pool'),
144 inputType
: 'password',
147 fieldLabel
: gettext('Confirm password'),
149 validator: function(value
) {
150 var pw
= me
.down('field[name=password]').getValue();
152 return "Passwords do not match!";
159 /*jslint confusion: false */
161 if (window
.FileReader
) {
165 text
: gettext('Load SSH Key File'),
167 change: function(btn
, e
, value
) {
169 me
.loadSSHKeyFromFile(e
.target
.files
[0]);
177 subject
: gettext('LXC Container'),
181 title
: gettext('General'),
182 onlineHelp
: 'pct_general',
185 xtype
: 'pveNodeSelector',
187 selectCurNode
: !me
.nodename
,
188 preferredValue
: me
.nodename
,
189 fieldLabel
: gettext('Node'),
191 onlineValidator
: true,
193 change: function(f
, value
) {
194 tmplstoragesel
.setNodename(value
);
195 tmplsel
.setStorage(undefined, value
);
196 networkpanel
.setNodename(value
);
197 rootfspanel
.setNodename(value
);
202 xtype
: 'pveGuestIDSelector',
203 name
: 'vmid', // backend only knows vmid
206 loadNextFreeID
: true,
207 validateExists
: false
210 xtype
: 'proxmoxtextfield',
214 fieldLabel
: gettext('Hostname'),
219 xtype
: 'proxmoxcheckbox',
220 name
: 'unprivileged',
223 change: function(f
, value
) {
225 rootfspanel
.down('field[name=quota]').setValue(false);
227 rootfspanel
.unprivileged
= value
;
228 var hdsel
= rootfspanel
.down('#hdstorage');
229 hdsel
.fireEvent('change', hdsel
, hdsel
.getValue());
232 fieldLabel
: gettext('Unprivileged container')
236 onGetValues: function(values
) {
237 delete values
.confirmpw
;
246 title
: gettext('Template'),
247 onlineHelp
: 'pct_container_images',
248 column1
: [ tmplstoragesel
, tmplsel
]
252 xtype
: 'pveLxcCPUInputPanel',
253 title
: gettext('CPU'),
257 xtype
: 'pveLxcMemoryInputPanel',
258 title
: gettext('Memory'),
263 xtype
: 'pveLxcDNSInputPanel',
264 title
: gettext('DNS'),
268 title
: gettext('Confirm'),
275 {header
: 'Key', width
: 150, dataIndex
: 'key'},
276 {header
: 'Value', flex
: 1, dataIndex
: 'value'}
281 show: function(panel
) {
282 var form
= me
.down('form').getForm();
283 var kv
= me
.getValues();
285 Ext
.Object
.each(kv
, function(key
, value
) {
286 if (key
=== 'delete' || key
=== 'tmplstorage') { // ignore
289 if (key
=== 'password') { // don't show pw
292 var html
= Ext
.htmlEncode(Ext
.JSON
.encode(value
));
293 data
.push({ key
: key
, value
: value
});
295 summarystore
.suspendEvents();
296 summarystore
.removeAll();
297 summarystore
.add(data
);
299 summarystore
.resumeEvents();
300 summarystore
.fireEvent('refresh');
303 onSubmit: function() {
304 var kv
= me
.getValues();
307 var nodename
= kv
.nodename
;
309 delete kv
.tmplstorage
;
311 if (!kv
.password
.length
&& kv
['ssh-public-keys']) {
315 Proxmox
.Utils
.API2Request({
316 url
: '/nodes/' + nodename
+ '/lxc',
320 success: function(response
, opts
){
321 var upid
= response
.result
.data
;
323 var win
= Ext
.create('Proxmox.window.TaskViewer', {
329 failure: function(response
, opts
) {
330 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);