1
|
define([
|
2
|
"steam2/user",
|
3
|
"steam2/models/Server",
|
4
|
// "stabile/menu",
|
5
|
"stabile/upload",
|
6
|
"stabile/images",
|
7
|
"stabile/servers",
|
8
|
"stabile/networks",
|
9
|
"steam2/stores",
|
10
|
"dijit/form/ComboBox"
|
11
|
], function(user, Server, /* menu,*/ upload, images, servers, networks, newStores){
|
12
|
var wizards = {};
|
13
|
var dialog;
|
14
|
|
15
|
wizards.server = {
|
16
|
installtype: "cdrom",
|
17
|
managementlink: null,
|
18
|
create: function(){
|
19
|
if(dijit.byId('createServerDialog') !== undefined){
|
20
|
// destroy the existing and its children
|
21
|
dijit.byId('createServerDialog').destroyRecursive();
|
22
|
}
|
23
|
|
24
|
dialog = new dijit.Dialog({ title: "Build new stack", id: 'createServerDialog'});
|
25
|
var wizard = new dojox.widget.Wizard({style: "width: 700px; height: 600px;"});
|
26
|
wizards.server.done.done = false;
|
27
|
|
28
|
function step_one(){
|
29
|
return [
|
30
|
'<form method="" action="" class="">',
|
31
|
' <p class="wizardInfoPane">',
|
32
|
' <a href="//docs.irigo.com/topics/byhsd2" rel="help" target="_blank" class="irigo-text">help</a>',
|
33
|
' </p>',
|
34
|
' <p>',
|
35
|
' <label for="server_name" style="width:200px;">Choose a name for your new server:</label>',
|
36
|
' <div id="server_name"></div>',
|
37
|
' </p>',
|
38
|
' <p>',
|
39
|
' <label for="master_select" style="width:200px;">Clone a preinstalled system:</label>',
|
40
|
' <div id="master_select"></div>',
|
41
|
' </p>',
|
42
|
' <p>',
|
43
|
' <label for="cdrom_select" style="width:200px;">Or install a new operating system:</label>',
|
44
|
' <div id="cdrom_select"></div>',
|
45
|
' </p>',
|
46
|
' <p>',
|
47
|
' <label for="image_select" style="width:200px;">Or use your own image:</label>',
|
48
|
' <div id="image_select"></div>',
|
49
|
' </p>',
|
50
|
' <p>',
|
51
|
' You may <a href="#images" onclick="wizards.server.select_images_tab();">upload</a> your own CD-rom, upload a preinstalled system (master' +
|
52
|
' image) or upload your own image on the storage tab.',
|
53
|
' </p>',
|
54
|
' <p class="wizardInfoPane" id="server_notes" style="display:none;">',
|
55
|
' </p>',
|
56
|
'</form>'].join('');
|
57
|
}
|
58
|
|
59
|
function set_default_name(servername) {
|
60
|
dijit.byId("server_name").setValue(servername);
|
61
|
}
|
62
|
function set_default_cdrom(item) {
|
63
|
dijit.byId("master_select").setValue(item.path);
|
64
|
}
|
65
|
|
66
|
function init_step_one(){
|
67
|
var server_name = new dijit.form.ValidationTextBox(
|
68
|
{
|
69
|
name: 'server_name',
|
70
|
type: 'text',
|
71
|
required: true,
|
72
|
style: "width:180px"
|
73
|
}, 'server_name');
|
74
|
var cdrom_select = new dijit.form.FilteringSelect(
|
75
|
{
|
76
|
name: 'cdrom_select',
|
77
|
type: 'text',
|
78
|
required: false,
|
79
|
store: stores.cdroms,
|
80
|
// value: '/mnt/stabile/images/common/ubuntu-9.10-server-amd64.iso',
|
81
|
query: {installable: 'true'},
|
82
|
searchAttr: 'name',
|
83
|
onChange: update_cdrom_notes,
|
84
|
style: "width:250px"
|
85
|
}, 'cdrom_select');
|
86
|
var master_select = new dijit.form.FilteringSelect(
|
87
|
{
|
88
|
name: 'master_select',
|
89
|
type: 'text',
|
90
|
required: false,
|
91
|
store: stores.masterimages,
|
92
|
query: {installable: 'true'},
|
93
|
searchAttr: 'name',
|
94
|
onChange: update_master_notes,
|
95
|
style: "width:250px"
|
96
|
}, 'master_select');
|
97
|
var image_select = new dijit.form.FilteringSelect(
|
98
|
{
|
99
|
name: 'image_select',
|
100
|
type: 'text',
|
101
|
required: false,
|
102
|
store: stores.unusedImages,
|
103
|
searchAttr: 'name',
|
104
|
onChange: update_image_notes,
|
105
|
style: "width:250px"
|
106
|
}, 'image_select');
|
107
|
}
|
108
|
|
109
|
function update_cdrom_notes(path) {
|
110
|
stores.cdroms.close();
|
111
|
stores.cdroms.fetchItemByIdentity({identity: path,
|
112
|
onItem: function(item, request){
|
113
|
var server_notes = document.getElementById("server_notes");
|
114
|
if (item) {
|
115
|
if (item.notes && item.notes!="") {
|
116
|
server_notes.innerHTML = item.notes;
|
117
|
server_notes.style.display = "block";
|
118
|
} else {
|
119
|
server_notes.innerHTML = "";
|
120
|
server_notes.style.display = "none";
|
121
|
}
|
122
|
dijit.byId('master_select').setValue('');
|
123
|
dijit.byId('image_select').setValue('');
|
124
|
}
|
125
|
}
|
126
|
});
|
127
|
}
|
128
|
function update_master_notes(path) {
|
129
|
stores.masterimages.close();
|
130
|
stores.masterimages.fetchItemByIdentity({identity: path,
|
131
|
onItem: function(item, request){
|
132
|
var server_notes = document.getElementById("server_notes");
|
133
|
if (item) {
|
134
|
if (item.notes && item.notes!="") {
|
135
|
server_notes.innerHTML = item.notes;
|
136
|
server_notes.style.display = "block";
|
137
|
} else {
|
138
|
server_notes.innerHTML = "";
|
139
|
server_notes.style.display = "none";
|
140
|
}
|
141
|
dijit.byId('cdrom_select').setValue('');
|
142
|
dijit.byId('image_select').setValue('');
|
143
|
}
|
144
|
}
|
145
|
});
|
146
|
}
|
147
|
|
148
|
function update_image_notes(path) {
|
149
|
stores.unusedImages.close();
|
150
|
stores.unusedImages.fetchItemByIdentity({identity: path,
|
151
|
onItem: function(item, request){
|
152
|
var server_notes = document.getElementById("server_notes");
|
153
|
if (item) {
|
154
|
if (item.notes && item.notes!="") {
|
155
|
server_notes.innerHTML = item.notes;
|
156
|
server_notes.style.display = "block";
|
157
|
} else {
|
158
|
server_notes.innerHTML = "";
|
159
|
server_notes.style.display = "none";
|
160
|
}
|
161
|
dijit.byId('cdrom_select').setValue('');
|
162
|
dijit.byId('master_select').setValue('');
|
163
|
}
|
164
|
}
|
165
|
});
|
166
|
}
|
167
|
function step_two(){
|
168
|
return [
|
169
|
'<form method="" action="" class="createServerForm">',
|
170
|
'<p class="wizardInfoPane">',
|
171
|
'<a href="//docs.irigo.com/topics/6dy" rel="help" target="_blank" class="irigo-text">help</a>',
|
172
|
'</p>',
|
173
|
'<p>',
|
174
|
'<label>Memory:</label>',
|
175
|
'<select id="server_memory" name="server_memory" style="width:80px">',
|
176
|
'<option>256</option>',
|
177
|
'<option>512</option>',
|
178
|
'<option>1024</option>',
|
179
|
'<option selected="selected">2048</option>',
|
180
|
'<option>4096</option>',
|
181
|
'<option>8192</option>',
|
182
|
'<option>16384</option>',
|
183
|
'</select>MB',
|
184
|
'</p>',
|
185
|
'<p id="server_disk">',
|
186
|
'<label for="server_disk_size">Total disk size:',
|
187
|
'<a href="//docs.irigo.com/topics/vjgbT8" rel="help" target="_blank" class="irigo-tooltip">help</a>',
|
188
|
'</label>',
|
189
|
'<input id="server_disk_size" style="width: 6em" />GB',
|
190
|
'</p>',
|
191
|
'<p>',
|
192
|
'<label>VCPUs: </label>',
|
193
|
'<input id="server_vcpus" name="server_vcpus" style="width:80px" />',
|
194
|
'</p>',
|
195
|
'<p>',
|
196
|
'<label>Instances: </label>',
|
197
|
'<input id="server_instances" name="server_instances" style="width:80px" />',
|
198
|
'</p>',
|
199
|
'</form>'].join('');
|
200
|
}
|
201
|
|
202
|
function init_step_two(){
|
203
|
dijit.form.NumberSpinner(
|
204
|
{
|
205
|
value: 20,
|
206
|
smallDelta: 1,
|
207
|
constraints: {
|
208
|
min: 1,
|
209
|
max: 500,
|
210
|
places: 0
|
211
|
},
|
212
|
name: "server_disk_size"
|
213
|
}, 'server_disk_size');
|
214
|
|
215
|
dijit.form.ComboBox({}, 'server_memory');
|
216
|
dijit.form.NumberSpinner(
|
217
|
{
|
218
|
value: 1,
|
219
|
smallDelta: 1,
|
220
|
constraints: {
|
221
|
min: 1,
|
222
|
max: 4,
|
223
|
places: 0
|
224
|
}
|
225
|
}, 'server_vcpus');
|
226
|
|
227
|
dijit.form.NumberSpinner(
|
228
|
{
|
229
|
value: 1,
|
230
|
smallDelta: 1,
|
231
|
constraints: {
|
232
|
min: 1,
|
233
|
max: 10,
|
234
|
places: 0
|
235
|
}
|
236
|
}, 'server_instances');
|
237
|
}
|
238
|
|
239
|
function step_three(){
|
240
|
return [
|
241
|
'<form method="" action="" class="createServerForm">',
|
242
|
'<p class="wizardInfoPane">',
|
243
|
'<a href="//docs.irigo.com/topics/u3Hd5" rel="help" target="_blank" class="irigo-text">help</a>',
|
244
|
'</p>',
|
245
|
/* '<p>',
|
246
|
'<label style="width:240px;">Create a new network:</label>',
|
247
|
'<input id="network_create" dojoType="dijit.form.CheckBox" checked="checked" />',
|
248
|
'</p>',
|
249
|
'<p>',
|
250
|
'<label style="width:240px;">Or select an existing:</label>',
|
251
|
'<div id="network_select"></div>',
|
252
|
'</p>',*/
|
253
|
'<p>',
|
254
|
'<label style="width:240px;">Start server(s):</label>',
|
255
|
'<input id="server_start" dojoType="dijit.form.CheckBox" checked="checked" />',
|
256
|
'</p>',
|
257
|
// '<p>',
|
258
|
// '<label style="width:240px;">Start administration console:</label>',
|
259
|
// '<input id="server_start_console" dojoType="dijit.form.CheckBox" checked="checked" />',
|
260
|
// '</p>',
|
261
|
'<p>',
|
262
|
'<label style="width:240px;">Allocate internal IP address(es):</label>',
|
263
|
'<input id="allocate_internalip" checked name="ip" dojoType="dijit.form.RadioButton" />',
|
264
|
'</p>',
|
265
|
'<p>',
|
266
|
'<label style="width:240px;">Allocate IP address mapping(s):</label>',
|
267
|
'<input id="allocate_ipmapping" name="ip" dojoType="dijit.form.RadioButton" />',
|
268
|
'</p>',
|
269
|
'<p>',
|
270
|
'<label style="width:240px;">Allocate external IP address(es):</label>',
|
271
|
'<input id="allocate_externalip" name="ip" dojoType="dijit.form.RadioButton" />',
|
272
|
'</p>',
|
273
|
'<p class="wizardInfoPane" id="finish_notes" style="display:none;">',
|
274
|
'</p>',
|
275
|
'<p id="consoleApplet"></p>',
|
276
|
'</form>'].join('');
|
277
|
}
|
278
|
|
279
|
function init_step_three(){
|
280
|
/*var network_select = new dijit.form.FilteringSelect(
|
281
|
{
|
282
|
name: 'network_select',
|
283
|
type: 'text',
|
284
|
required: true,
|
285
|
store: stores.networks,
|
286
|
searchAttr: 'name'
|
287
|
}, 'network_select');*/
|
288
|
}
|
289
|
|
290
|
var step_one_pane = new dojox.widget.WizardPane(
|
291
|
{
|
292
|
content: step_one(),
|
293
|
passFunction: wizards.server.validateStepOne
|
294
|
});
|
295
|
|
296
|
var step_two_pane = new dojox.widget.WizardPane(
|
297
|
{
|
298
|
content: step_two(),
|
299
|
passFunction: wizards.server.validateStepTwo
|
300
|
});
|
301
|
|
302
|
var step_three_pane = new dojox.widget.WizardPane(
|
303
|
{
|
304
|
content: step_three(),
|
305
|
passFunction: wizards.server.validateStepThree,
|
306
|
doneFunction: wizards.server.done
|
307
|
});
|
308
|
|
309
|
// stores.images.fetch({query: {user: user.username}});
|
310
|
// stores.images.close();
|
311
|
|
312
|
wizard.addChild(step_one_pane);
|
313
|
wizard.addChild(step_two_pane);
|
314
|
wizard.addChild(step_three_pane);
|
315
|
|
316
|
dialog.set('content',wizard);
|
317
|
|
318
|
init_step_one();
|
319
|
|
320
|
stores.images.fetch({query: {user: user.username}, onComplete: function(items) {
|
321
|
i = (items?items.length+1:1);
|
322
|
testName(i);
|
323
|
}});
|
324
|
|
325
|
function testName(i) {
|
326
|
//testname = user.username + '-server' + i;
|
327
|
testname = user.username + '-server-' + Math.uuid().toLowerCase().substr(0,4);
|
328
|
testpath = "/mnt/stabile/images/" + user.username + "/" + testname + " image.qcow2";
|
329
|
var master = dijit.byId('master_select').value;
|
330
|
if (master != '') {
|
331
|
testpath = master.replace(/(\/.+\/)(\w+)(\/.+)/,"$1" + user.username + "/" + testname + " image.qcow2");
|
332
|
}
|
333
|
stores.images.fetch({query: {path: testpath}, onComplete: function(items2) {
|
334
|
if (items2 && items2.length>0) {
|
335
|
i = i + 1;
|
336
|
testName(i);
|
337
|
}
|
338
|
else (set_default_name(testname));
|
339
|
}});
|
340
|
}
|
341
|
|
342
|
|
343
|
stores.masterimages.fetch({query: {path: "*lamp*"}, onItem: set_default_cdrom});
|
344
|
init_step_two();
|
345
|
init_step_three();
|
346
|
var qText = dojo.query('.irigo-text');
|
347
|
var qTooltip = dojo.query('.irigo-tooltip');
|
348
|
|
349
|
if(qText.irigoText){qText.irigoText();}
|
350
|
if(qTooltip.irigoTooltip){qTooltip.irigoTooltip();}
|
351
|
dialog.show();
|
352
|
},
|
353
|
|
354
|
select_images_tab: function() {
|
355
|
dijit.byId('createServerDialog').hide();
|
356
|
upload.showDialog();
|
357
|
},
|
358
|
|
359
|
startConsole: function(uuid) {
|
360
|
var goon = function(item){
|
361
|
var ip = item[0].macip[0];
|
362
|
var port = item[0].port[0];
|
363
|
var name = item[0].name[0];
|
364
|
console.log("Got: " + ip + ":" + port + ":" + name + ":" + user.get());
|
365
|
|
366
|
var args = {
|
367
|
host: window.location.host,
|
368
|
remote_ip: ip,
|
369
|
local_port: 8240,
|
370
|
// lang: dijit.byId("keyboard").get('value'),
|
371
|
// screen_size: dijit.byId("screensize").get('value'),
|
372
|
window_title: name,
|
373
|
remote_port: port,
|
374
|
username: "irigo-" + user.get(),
|
375
|
display_type: "vnc",
|
376
|
append_to: "consoleApplet"
|
377
|
};
|
378
|
display.start("consoleApplet", args);
|
379
|
};
|
380
|
stores.servers.close();
|
381
|
stores.servers.fetch({query: {uuid: uuid}, onComplete: goon});
|
382
|
ui_update.onUpdate({id: "servers", force: "true"});
|
383
|
},
|
384
|
|
385
|
done: function(){
|
386
|
if (wizards.server.done.done) {
|
387
|
//alert("Already done!");
|
388
|
dialog.hide()
|
389
|
return;
|
390
|
} else {
|
391
|
wizards.server.done.done = true;
|
392
|
}
|
393
|
|
394
|
var cdrom = dijit.byId('cdrom_select').value;
|
395
|
var master = dijit.byId('master_select').value;
|
396
|
var image2 = "";
|
397
|
var ownimage = dijit.byId('image_select').value;
|
398
|
var ownimagename = dijit.byId('image_select').displayedValue;
|
399
|
|
400
|
var name = dojo.byId('server_name').value;
|
401
|
var memory = dijit.byId('server_memory').value;
|
402
|
var disk_size = dojo.byId('server_disk_size').value *1024*1024*1024; // disk size in bytes
|
403
|
var vcpus = dijit.byId('server_vcpus').value;
|
404
|
var instances = dijit.byId('server_instances').value;
|
405
|
var instances_done = 0;
|
406
|
|
407
|
var image = images.model(
|
408
|
{
|
409
|
name: name + ' image' + "-" + instances_done,
|
410
|
virtualsize: disk_size
|
411
|
});
|
412
|
|
413
|
var network = networks.model(
|
414
|
{
|
415
|
name: name + ' network' + "-" + instances_done,
|
416
|
type: 'ipmapping',
|
417
|
internalip: 'new'
|
418
|
});
|
419
|
|
420
|
var server = new Server({
|
421
|
cdrom: cdrom,
|
422
|
boot: "cdrom",
|
423
|
name: name + "-" + instances_done,
|
424
|
memory: memory,
|
425
|
vcpu: vcpus,
|
426
|
image: image.getPath(),
|
427
|
imagename: image.name
|
428
|
});
|
429
|
|
430
|
// new image
|
431
|
var imageItem = null;
|
432
|
var networkItem = null;
|
433
|
var serverItem = null;
|
434
|
|
435
|
|
436
|
function saveFailed(e){
|
437
|
IRIGO.toaster("A wizard error ocurred: " + e);
|
438
|
}
|
439
|
|
440
|
function saveImageFailed(e){
|
441
|
console.log("Problem creating image:" + image.name);
|
442
|
stores.images.revert();
|
443
|
stores.images.close();
|
444
|
saveFailed(e);
|
445
|
}
|
446
|
|
447
|
function saveNetworkFailed(e){
|
448
|
console.log("Problem creating network:" + network.name);
|
449
|
if (imageItem != null) {
|
450
|
stores.images.setValue(imageItem, "action", "delete");
|
451
|
stores.images.save({onComplete: function(){
|
452
|
stores.networks.revert();
|
453
|
stores.networks.close();
|
454
|
saveFailed(e);
|
455
|
}});
|
456
|
} else {
|
457
|
saveFailed(e);
|
458
|
}
|
459
|
}
|
460
|
|
461
|
function saveServerFailed(e){
|
462
|
console.log("Problem creating server: " + server.name);
|
463
|
if (networkItem != null) {
|
464
|
stores.networks.setValue(networkItem, "action", "delete");
|
465
|
stores.networks.save();
|
466
|
}
|
467
|
if (imageItem != null) {
|
468
|
stores.images.setValue(imageItem, "action", "delete");
|
469
|
stores.images.save({onComplete: function(){
|
470
|
stores.servers.revert();
|
471
|
stores.servers.close();
|
472
|
saveFailed(e);
|
473
|
}});
|
474
|
} else {
|
475
|
stores.servers.revert();
|
476
|
stores.servers.close();
|
477
|
saveFailed(e);
|
478
|
}
|
479
|
saveFailed(e);
|
480
|
}
|
481
|
|
482
|
function startNetwork(uuid) {
|
483
|
var postData = "{\"identifier\": \"uuid\", \"label\": \"uuid\", \"items\":[{\"action\": \"activate\", \"uuid\": \"" + uuid + "\"}]}";
|
484
|
var xhrArgs = {
|
485
|
url: "/stabile/networks",
|
486
|
postData: postData,
|
487
|
load: function(data){
|
488
|
;
|
489
|
},
|
490
|
error: function(error){
|
491
|
saveNetworkFailed(error);
|
492
|
}
|
493
|
}
|
494
|
var deferred = dojo.xhrPost(xhrArgs);
|
495
|
}
|
496
|
|
497
|
function startServer(uuid) {
|
498
|
var postData = "{\"identifier\": \"uuid\", \"label\": \"uuid\", \"items\":[{\"action\": \"start\", \"uuid\": \"" + uuid + "\"}]}";
|
499
|
var xhrArgs = {
|
500
|
url: "/stabile/servers",
|
501
|
postData: postData,
|
502
|
load: function(data){
|
503
|
startNetwork(networkItem.uuid);
|
504
|
var finish_notes = document.getElementById("finish_notes");
|
505
|
finish_notes.innerHTML += "<br>Your server is being started!<br><br>" +
|
506
|
"<!-- Click <a href='#' onclick='wizards.server.startConsole(\"" + uuid + "\");'>here</a> to access your servers console. -->";
|
507
|
//home.refresh();
|
508
|
},
|
509
|
error: function(error){
|
510
|
;
|
511
|
}
|
512
|
}
|
513
|
var deferred = dojo.xhrPost(xhrArgs);
|
514
|
}
|
515
|
|
516
|
function finish(){
|
517
|
if(dojo.byId('server_start').checked === true) startServer(server.uuid);
|
518
|
else startNetwork(networkItem.uuid);
|
519
|
dijit.byId('server_start').set("disabled", true);
|
520
|
dijit.byId('allocate_internalip').set("disabled", true);
|
521
|
dijit.byId('allocate_ipmapping').set("disabled", true);
|
522
|
dijit.byId('allocate_externalip').set("disabled", true);
|
523
|
|
524
|
instances_done++;
|
525
|
if (instances_done < instances) {
|
526
|
|
527
|
imageItem.status[0] = "used"; // We have not read new image status, so update locally
|
528
|
image = images.model(
|
529
|
{
|
530
|
name: name + ' image' + "-" + instances_done,
|
531
|
virtualsize: disk_size
|
532
|
});
|
533
|
|
534
|
network = networks.model(
|
535
|
{
|
536
|
name: name + ' network' + "-" + instances_done,
|
537
|
type: 'ipmapping',
|
538
|
internalip: 'new'
|
539
|
});
|
540
|
|
541
|
server = servers.model(
|
542
|
{
|
543
|
cdrom: cdrom,
|
544
|
boot: "cdrom",
|
545
|
name: name + "-" + instances_done,
|
546
|
memory: memory,
|
547
|
vcpu: vcpus,
|
548
|
image: image.getPath(),
|
549
|
imagename: image.name
|
550
|
});
|
551
|
|
552
|
console.log("More instances requested: " + instances_done );
|
553
|
begin();
|
554
|
} else {
|
555
|
console.log("Updating all tabs...");
|
556
|
|
557
|
// stores.servers.fetch({query: {user: user.username}});
|
558
|
// stores.servers.close();
|
559
|
newStores.servers.reset();
|
560
|
stores.networks.fetch({query: {user: user.username}});
|
561
|
stores.networks.close();
|
562
|
stores.images.fetch({query: {user: user.username}});
|
563
|
stores.images.close();
|
564
|
|
565
|
// ui_update.onUpdate({id: "networks", force: "true"});
|
566
|
// ui_update.onUpdate({id: "images", force: "true"});
|
567
|
// ui_update.onUpdate({id: "servers", force: "true"});
|
568
|
if (user.is_admin) ui_update.onUpdate({id: "nodes", force: "true"});
|
569
|
home.refresh();
|
570
|
}
|
571
|
|
572
|
// dialog.hide();
|
573
|
// wizards.server.done.done = true;
|
574
|
|
575
|
}
|
576
|
|
577
|
function get_networkid(items){
|
578
|
if (items && items[0]) {
|
579
|
server.networkid1 = items[0].id;
|
580
|
server.networkuuid1 = networkItem.uuid;
|
581
|
server.networkname1 = networkItem.name;
|
582
|
network.id = items[0].id;
|
583
|
var subnet = networks.getFirstThreeOctetsbyVlan(network.id);
|
584
|
var internalip = items[0].internalip;
|
585
|
var externalip = items[0].externalip;
|
586
|
console.log("Server configured with network id: " + network.id);
|
587
|
var networknotes;
|
588
|
if (dojo.byId('allocate_internalip').checked === true) {
|
589
|
networknotes = "Your server has been assigned the internal IP address: " + internalip +
|
590
|
" (with subnet: " + subnet + ".0/255.255.255.0, default gateway and name server: " + subnet + ".1)";
|
591
|
} else if (dojo.byId('allocate_ipmapping').checked === true) {
|
592
|
networknotes = "Your server has been assigned the internal IP address: " + internalip +
|
593
|
" (with subnet: " + subnet + ".0/255.255.255.0, default gateway and name server: " + subnet + ".1)" +
|
594
|
"<br>Your server has also been assigned an external IP address: " + externalip;
|
595
|
} else if (dojo.byId('allocate_externalip').checked) {
|
596
|
networknotes = "Your server has been assigned the external IP address: " + externalip;
|
597
|
}
|
598
|
var finish_notes = document.getElementById("finish_notes");
|
599
|
finish_notes.innerHTML += networknotes;
|
600
|
finish_notes.style.display = "block";
|
601
|
} else {
|
602
|
stores.networks.fetchItemByIdentity({identity: "1",
|
603
|
onItem: function(item, request){
|
604
|
if (item) {
|
605
|
server.networkid1 = item.nextid;
|
606
|
server.networkuuid1 = networkItem.uuid;
|
607
|
server.networkname1 = networkItem.name;
|
608
|
console.log("Server will be configured with network id: " + item.nextid);
|
609
|
} else {
|
610
|
console.log("Server will be configured with only outgoing network");
|
611
|
}
|
612
|
var finish_notes = document.getElementById("finish_notes");
|
613
|
finish_notes.innerHTML += "There was a problem configuring your servers network access.<br>";
|
614
|
finish_notes.style.display = "block";
|
615
|
}
|
616
|
});
|
617
|
}
|
618
|
save_server();
|
619
|
|
620
|
}
|
621
|
|
622
|
function save_server(response){
|
623
|
// if(dojo.byId('server_start').checked === true) server.action = "start";
|
624
|
serverItem = stores.servers.newItem(server);
|
625
|
stores.servers.save({onComplete: finish, onError: saveServerFailed });
|
626
|
}
|
627
|
|
628
|
function save_network(){
|
629
|
if (dojo.byId('allocate_internalip').checked === true) network.type = "internalip";
|
630
|
else if (dojo.byId('allocate_ipmapping').checked === true) network.type = "ipmapping";
|
631
|
else if (dojo.byId('allocate_externalip').checked === true) network.type = "externalip";
|
632
|
console.log("Creating network...");
|
633
|
networkItem = stores.networks.newItem(network);
|
634
|
stores.networks.save({onComplete: get_networks, onError: saveNetworkFailed });
|
635
|
}
|
636
|
|
637
|
function get_networks(){
|
638
|
stores.networks.fetch({query: {user: user.username}}); // just to make sure calling close() doesn't make problems...
|
639
|
stores.networks.close();
|
640
|
// stores.networks.fetch({query: {uuid: network.uuid}, onComplete: finish});
|
641
|
stores.networks.fetch({query: {uuid: network.uuid}, onComplete: get_networkid});
|
642
|
}
|
643
|
|
644
|
function make_clone() {
|
645
|
stores.images.save({onComplete: get_clone, onError: saveImageFailed });
|
646
|
}
|
647
|
|
648
|
function get_clone() {
|
649
|
// Get the path of the cloned image
|
650
|
var clone = master;
|
651
|
//clone = clone.replace(/(\/mnt\/home\/images\/)(.+)(\/.+)/,"$1" + user.username + "$3");
|
652
|
clone = clone.replace(/(\/.+\/)(\w+)(\/.+)/,"$1" + user.username + "$3");
|
653
|
if (clone.indexOf(".clone")!=-1) {
|
654
|
clone = clone.substring(0, clone.indexOf(".clone")) + ".clone";
|
655
|
} else {
|
656
|
clone = clone.substring(0, clone.indexOf(".master.qcow2")) + ".clone";
|
657
|
}
|
658
|
if (image2 && image2!="" && image2 !="--") {
|
659
|
//image2 = image2.replace(/(\/mnt\/home\/images\/)(.+)(\/.+)/,"$1" + user.username + "$3");
|
660
|
image2 = image2.replace(/(\/\w+\/)(.+)(\/.+)/,"$1" + user.username + "$3");
|
661
|
image2 = image2.substring(0, image2.indexOf(".master.qcow2")) + ".clone";
|
662
|
}
|
663
|
stores.images.close();
|
664
|
stores.images.fetch({query: {path: clone+"*"}, onComplete: function(items) {
|
665
|
if (items && items.length>0) {
|
666
|
for (i=0; i<items.length; i++) {
|
667
|
console.log(items[i].path[0] + ":" + items[i].status[0]);
|
668
|
if (items[i].status[0] == "cloning" && items[i].path[0].indexOf(".master.qcow2")==-1) {
|
669
|
console.log("Found clone: " + items[i].path[0] + ":" + items[i].name[0]);
|
670
|
imageItem = items[i];
|
671
|
server.image = items[i].path[0];
|
672
|
server.imagename = items[i].name[0];
|
673
|
server.boot = "hd";
|
674
|
break;
|
675
|
}
|
676
|
}
|
677
|
if (image2 && image2!="" && image2 !="--") {
|
678
|
|
679
|
stores.images.fetch({query: {path: image2+"*"}, onComplete: function(items) {
|
680
|
if (items && items.length>0) {
|
681
|
for (i=0; i<items.length; i++) {
|
682
|
if (items[i].status[0] == "cloning") {
|
683
|
console.log("Found clone2: " + items[i].path[0] + ":" + items[i].name[0]);
|
684
|
server.image2 = items[i].path[0];
|
685
|
server.image2name = items[i].name[0];
|
686
|
break;
|
687
|
}
|
688
|
}
|
689
|
save_network();
|
690
|
} else {
|
691
|
console.log("No clone2 found..." + clone);
|
692
|
saveImageFailed();
|
693
|
}
|
694
|
}, onError: saveImageFailed});
|
695
|
|
696
|
} else {
|
697
|
save_network();
|
698
|
}
|
699
|
} else {
|
700
|
console.log("No clone " + clone + " found of " + master);
|
701
|
saveImageFailed();
|
702
|
}
|
703
|
}, onError: saveImageFailed});
|
704
|
}
|
705
|
|
706
|
function save_image(){
|
707
|
if (wizards.server.installtype == "cdrom" ) {
|
708
|
imageItem = stores.images.newItem(image);
|
709
|
imageItem.path[0] = image.getPath();
|
710
|
stores.images.save({onComplete: save_network, onError: saveImageFailed });
|
711
|
}
|
712
|
else if (wizards.server.installtype == "master") {
|
713
|
stores.images.fetch({query: {path: master}, onComplete: function(items) {
|
714
|
if (items && items.length==1) {
|
715
|
stores.images.setValue(items[0], "action","clone");
|
716
|
wizards.server.managementlink = items[0].managementlink[0];
|
717
|
if (items[0].image2 && items[0].image2[0]!="" && items[0].image2[0]!="--") {
|
718
|
image2 = items[0].image2[0];
|
719
|
stores.images.fetch({query: {path: image2}, onComplete: function(items2) {
|
720
|
if (items2 && items2.length==1) {
|
721
|
console.log("Cloning secondary image: " + image2);
|
722
|
stores.images.setValue(items2[0], "action","clone");
|
723
|
make_clone();
|
724
|
}
|
725
|
}, onError: saveImageFailed});
|
726
|
} else {
|
727
|
image2 = "";
|
728
|
make_clone();
|
729
|
}
|
730
|
}
|
731
|
}, onError: saveImageFailed});
|
732
|
}
|
733
|
else if (wizards.server.installtype == "ownimage") {
|
734
|
server.image = ownimage;
|
735
|
server.imagename = ownimagename;
|
736
|
server.boot = "hd";
|
737
|
save_network();
|
738
|
}
|
739
|
}
|
740
|
|
741
|
function begin(){
|
742
|
save_image();
|
743
|
}
|
744
|
|
745
|
begin();
|
746
|
|
747
|
},
|
748
|
validateStepOne: function(){
|
749
|
wizards.server.installtype = "cdrom"
|
750
|
var os = dijit.byId('cdrom_select').value;
|
751
|
if (!os || os === '--') {
|
752
|
os = dijit.byId('master_select').value;
|
753
|
wizards.server.installtype = "master";
|
754
|
}
|
755
|
if (!os || os === '--'){
|
756
|
os = dijit.byId('image_select').value;
|
757
|
wizards.server.installtype = "ownimage";
|
758
|
}
|
759
|
var name = dojo.byId('server_name').value;
|
760
|
|
761
|
if(!name || name === ""){
|
762
|
return "Please name the server";
|
763
|
}
|
764
|
if(!os || os === '--'){
|
765
|
wizards.server.installtype = "cdrom";
|
766
|
return "Please choose an OS";
|
767
|
}
|
768
|
var server_disk = document.getElementById("server_disk");
|
769
|
if (dijit.byId('cdrom_select').value=='') server_disk.style.display = "none";
|
770
|
else server_disk.style.display = "block";
|
771
|
return null;
|
772
|
},
|
773
|
|
774
|
validateStepTwo: function(){
|
775
|
var disk_size = dijit.byId('server_disk_size').value;
|
776
|
var memory = dijit.byId('server_memory').value;
|
777
|
var vcpus = dijit.byId('server_vcpus').value;
|
778
|
var instances = dijit.byId('server_instances').value;
|
779
|
if(!disk_size){
|
780
|
return "Please choose disk size";
|
781
|
}
|
782
|
if(!memory){
|
783
|
return "Please choose memory size";
|
784
|
}
|
785
|
if(!vcpus){
|
786
|
return "Please number of VCPUs";
|
787
|
}
|
788
|
if (user.memoryquota > 0 && memory > user.memoryquota) {
|
789
|
return "This is over your current quota. Please choose a smaller amount of memory (RAM).";
|
790
|
}
|
791
|
if (user.vcpuquota > 0 && instances * vcpus > user.vcpuquota) {
|
792
|
return "This is over your current quota. Please choose a lower number of VCPUs or instances.";
|
793
|
}
|
794
|
|
795
|
return null;
|
796
|
},
|
797
|
|
798
|
validateStepThree: function(){
|
799
|
/*var network_select = dijit.byId('network_select').value;
|
800
|
var network_create = dijit.byId('network_create').checked;
|
801
|
if (!network_create && !network_select) {
|
802
|
return "Please select an existing network or check checkbox to create one"
|
803
|
}*/
|
804
|
return null;
|
805
|
}
|
806
|
};
|
807
|
window.wizards = wizards;
|
808
|
|
809
|
})
|
810
|
|
811
|
|
812
|
|