Project

General

Profile

Download (32.7 KB) Statistics
| Branch: | Revision:
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

    
(23-23/23)