Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / ui / static / snf / js / ui / web / ui_single_view.js @ 5be51d4f

History | View | Annotate | Download (16.4 kB)

1 00469232 Kostas Papadimitriou
// Copyright 2011 GRNET S.A. All rights reserved.
2 00469232 Kostas Papadimitriou
// 
3 00469232 Kostas Papadimitriou
// Redistribution and use in source and binary forms, with or
4 00469232 Kostas Papadimitriou
// without modification, are permitted provided that the following
5 00469232 Kostas Papadimitriou
// conditions are met:
6 00469232 Kostas Papadimitriou
// 
7 00469232 Kostas Papadimitriou
//   1. Redistributions of source code must retain the above
8 00469232 Kostas Papadimitriou
//      copyright notice, this list of conditions and the following
9 00469232 Kostas Papadimitriou
//      disclaimer.
10 00469232 Kostas Papadimitriou
// 
11 00469232 Kostas Papadimitriou
//   2. Redistributions in binary form must reproduce the above
12 00469232 Kostas Papadimitriou
//      copyright notice, this list of conditions and the following
13 00469232 Kostas Papadimitriou
//      disclaimer in the documentation and/or other materials
14 00469232 Kostas Papadimitriou
//      provided with the distribution.
15 00469232 Kostas Papadimitriou
// 
16 00469232 Kostas Papadimitriou
// THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 00469232 Kostas Papadimitriou
// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 00469232 Kostas Papadimitriou
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 00469232 Kostas Papadimitriou
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 00469232 Kostas Papadimitriou
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 00469232 Kostas Papadimitriou
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 00469232 Kostas Papadimitriou
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 00469232 Kostas Papadimitriou
// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 00469232 Kostas Papadimitriou
// AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 00469232 Kostas Papadimitriou
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 00469232 Kostas Papadimitriou
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 00469232 Kostas Papadimitriou
// POSSIBILITY OF SUCH DAMAGE.
28 00469232 Kostas Papadimitriou
// 
29 00469232 Kostas Papadimitriou
// The views and conclusions contained in the software and
30 00469232 Kostas Papadimitriou
// documentation are those of the authors and should not be
31 00469232 Kostas Papadimitriou
// interpreted as representing official policies, either expressed
32 00469232 Kostas Papadimitriou
// or implied, of GRNET S.A.
33 00469232 Kostas Papadimitriou
// 
34 00469232 Kostas Papadimitriou
35 8d08f18a Kostas Papadimitriou
;(function(root){
36 8d08f18a Kostas Papadimitriou
37 8d08f18a Kostas Papadimitriou
    // root
38 8d08f18a Kostas Papadimitriou
    var root = root;
39 8d08f18a Kostas Papadimitriou
    
40 8d08f18a Kostas Papadimitriou
    // setup namepsaces
41 8d08f18a Kostas Papadimitriou
    var snf = root.synnefo = root.synnefo || {};
42 8d08f18a Kostas Papadimitriou
    var models = snf.models = snf.models || {}
43 8d08f18a Kostas Papadimitriou
    var storage = snf.storage = snf.storage || {};
44 8d08f18a Kostas Papadimitriou
    var ui = snf.ui = snf.ui || {};
45 8d08f18a Kostas Papadimitriou
    var util = snf.util = snf.util || {};
46 8d08f18a Kostas Papadimitriou
47 8d08f18a Kostas Papadimitriou
    var views = snf.views = snf.views || {}
48 8d08f18a Kostas Papadimitriou
49 8d08f18a Kostas Papadimitriou
    // shortcuts
50 8d08f18a Kostas Papadimitriou
    var bb = root.Backbone;
51 75331d54 Kostas Papadimitriou
    var hasKey = Object.prototype.hasOwnProperty;
52 32a58fdf Kostas Papadimitriou
    
53 32a58fdf Kostas Papadimitriou
    views.VMSinglePortListView = views.VMPortListView.extend({
54 32a58fdf Kostas Papadimitriou
      
55 32a58fdf Kostas Papadimitriou
      init: function() {
56 32a58fdf Kostas Papadimitriou
        views.VMSinglePortListView.__super__.init.apply(this);
57 32a58fdf Kostas Papadimitriou
        this.open = false;
58 32a58fdf Kostas Papadimitriou
        this.vm_el = $(this.options.vm_view);
59 32a58fdf Kostas Papadimitriou
        this.tags_toggler = this.vm_el.find(".tags-header");
60 32a58fdf Kostas Papadimitriou
        this.tags_content = this.vm_el.find(".tags-content");
61 32a58fdf Kostas Papadimitriou
        this.toggler = this.vm_el.find(".toggler-header.ips");
62 32a58fdf Kostas Papadimitriou
        this.toggler_content = this.vm_el.find(".ips-content");
63 32a58fdf Kostas Papadimitriou
        this.toggler_content.hide();
64 32a58fdf Kostas Papadimitriou
        $(this.el).show();
65 32a58fdf Kostas Papadimitriou
        
66 32a58fdf Kostas Papadimitriou
        var self = this;
67 32a58fdf Kostas Papadimitriou
        this.toggler.click(function() {
68 5be51d4f Kostas Papadimitriou
          var disabled = self.toggler.parent().find(".cont-toggler-wrapper").hasClass("disabled");
69 5be51d4f Kostas Papadimitriou
          if (disabled) { return; }
70 32a58fdf Kostas Papadimitriou
          self.toggle();
71 32a58fdf Kostas Papadimitriou
        });
72 32a58fdf Kostas Papadimitriou
73 32a58fdf Kostas Papadimitriou
        this.tags_toggler.click(function() {
74 32a58fdf Kostas Papadimitriou
          self.toggler.find(".toggler").removeClass("open");
75 f5c5fb5e Kostas Papadimitriou
          var f = function() { self.hide(true) }
76 f5c5fb5e Kostas Papadimitriou
          self.toggler_content.slideUp(f);
77 32a58fdf Kostas Papadimitriou
        });
78 32a58fdf Kostas Papadimitriou
      },
79 32a58fdf Kostas Papadimitriou
80 32a58fdf Kostas Papadimitriou
      toggle: function() {
81 f5c5fb5e Kostas Papadimitriou
        var self = this;
82 32a58fdf Kostas Papadimitriou
        this.open = !this.open;
83 32a58fdf Kostas Papadimitriou
84 32a58fdf Kostas Papadimitriou
        if (this.open) {
85 32a58fdf Kostas Papadimitriou
          this.show(true);
86 32a58fdf Kostas Papadimitriou
          this.tags_toggler.find(".toggler").removeClass("open");
87 32a58fdf Kostas Papadimitriou
          this.tags_content.slideUp();
88 32a58fdf Kostas Papadimitriou
          this.toggler.find(".toggler").addClass("open");
89 32a58fdf Kostas Papadimitriou
          this.toggler_content.removeClass(".hidden").slideDown();
90 32a58fdf Kostas Papadimitriou
        } else {
91 32a58fdf Kostas Papadimitriou
          this.toggler.find(".toggler").removeClass("open");
92 f5c5fb5e Kostas Papadimitriou
          var f = function() { self.hide(true) }
93 32a58fdf Kostas Papadimitriou
          this.toggler_content.removeClass(".hidden").slideUp();
94 32a58fdf Kostas Papadimitriou
        }
95 32a58fdf Kostas Papadimitriou
      }
96 32a58fdf Kostas Papadimitriou
    });
97 75331d54 Kostas Papadimitriou
98 8d08f18a Kostas Papadimitriou
    views.SingleDetailsView = views.VMDetailsView.extend({
99 8d08f18a Kostas Papadimitriou
    
100 8d08f18a Kostas Papadimitriou
        view_id: "vm_details_single",
101 8d08f18a Kostas Papadimitriou
        el_sel: '.machine-details',
102 8d08f18a Kostas Papadimitriou
        
103 8d08f18a Kostas Papadimitriou
        selectors: {
104 8d08f18a Kostas Papadimitriou
            'cpu': '.machine-detail.cpus',
105 8d08f18a Kostas Papadimitriou
            'ram': '.machine-detail.ram',
106 8d08f18a Kostas Papadimitriou
            'disk': '.machine-detail.disk',
107 8d08f18a Kostas Papadimitriou
            'image_name': '.machine-detail.image-name',
108 8d08f18a Kostas Papadimitriou
            'image_size': '.machine-detail.image-size'
109 32a58fdf Kostas Papadimitriou
        },
110 8d08f18a Kostas Papadimitriou
    
111 8d08f18a Kostas Papadimitriou
    })
112 8d08f18a Kostas Papadimitriou
113 8d08f18a Kostas Papadimitriou
    // VMs single view
114 8d08f18a Kostas Papadimitriou
    views.SingleView = views.VMListView.extend({
115 8d08f18a Kostas Papadimitriou
        
116 8d08f18a Kostas Papadimitriou
        // view id (this could be used to identify 
117 8d08f18a Kostas Papadimitriou
        // the view object from global context
118 8d08f18a Kostas Papadimitriou
        view_id: 'vm_single',
119 8d08f18a Kostas Papadimitriou
120 8d08f18a Kostas Papadimitriou
        el: '#machinesview-single',
121 23a3bb8e Kostas Papadimitriou
        id_tpl: 'single-vm-',
122 23a3bb8e Kostas Papadimitriou
        link_id_tpl: 'single-vm-at-',
123 8d08f18a Kostas Papadimitriou
124 8d08f18a Kostas Papadimitriou
        hide_actions: false,
125 8d08f18a Kostas Papadimitriou
126 8d08f18a Kostas Papadimitriou
        selectors: {
127 8d08f18a Kostas Papadimitriou
            'vms': '.single-container',
128 75331d54 Kostas Papadimitriou
            'vm': '#single-vm-',
129 8d08f18a Kostas Papadimitriou
            'view': '#machinesview-single',
130 8e701482 Kostas Papadimitriou
            'tpl': '.single-container-template',
131 8d08f18a Kostas Papadimitriou
            'spinner': '.large-spinner',
132 75331d54 Kostas Papadimitriou
            'vm_spinner': '#single-vm-{0} .state .spinner',
133 75331d54 Kostas Papadimitriou
            'vm_wave': '#single-vm-{0} img.wave',
134 8d08f18a Kostas Papadimitriou
            'vm_cont_active': '#machinesview-single',
135 8d08f18a Kostas Papadimitriou
            'vm_cont_terminated': '#machinesview-single'
136 8d08f18a Kostas Papadimitriou
        },
137 8d08f18a Kostas Papadimitriou
        
138 8d08f18a Kostas Papadimitriou
        initialize: function() {
139 8d08f18a Kostas Papadimitriou
            this.current_vm = 0;
140 8d08f18a Kostas Papadimitriou
            
141 8d08f18a Kostas Papadimitriou
            // button selectors
142 8d08f18a Kostas Papadimitriou
            this.prev_button = this.$(".controls .previous");
143 8d08f18a Kostas Papadimitriou
            this.next_button = this.$(".controls .next");
144 8d08f18a Kostas Papadimitriou
            this.menu = $("#single-servers-list");
145 8d08f18a Kostas Papadimitriou
146 8d08f18a Kostas Papadimitriou
            views.SingleView.__super__.initialize.apply(this, arguments);
147 c343513e Kostas Papadimitriou
            this.update_current_vm();
148 8d08f18a Kostas Papadimitriou
        },
149 8d08f18a Kostas Papadimitriou
150 8d08f18a Kostas Papadimitriou
        // overload show function
151 2ab5aa9a Kostas Papadimitriou
        show: function() {
152 2ab5aa9a Kostas Papadimitriou
            views.SingleView.__super__.show.apply(this, arguments);
153 8d08f18a Kostas Papadimitriou
            this.log.debug("showing");
154 8d08f18a Kostas Papadimitriou
            this.$(".column3").show();
155 2ab5aa9a Kostas Papadimitriou
            this.show_vm_menu();
156 2ab5aa9a Kostas Papadimitriou
            this.show_current();
157 8d08f18a Kostas Papadimitriou
        },
158 8d08f18a Kostas Papadimitriou
159 8d08f18a Kostas Papadimitriou
        show_vm: function(vm) {
160 513eafb4 Kostas Papadimitriou
            if (!vm) { return };
161 8d08f18a Kostas Papadimitriou
            this.current_vm_instance = vm;
162 8d08f18a Kostas Papadimitriou
            this.show_vm_menu();
163 8d08f18a Kostas Papadimitriou
            this.show_current();
164 8d08f18a Kostas Papadimitriou
            this.update_layout();
165 8d08f18a Kostas Papadimitriou
        },
166 8d08f18a Kostas Papadimitriou
167 8d08f18a Kostas Papadimitriou
        // identify vm model instance id based on DOM element
168 8d08f18a Kostas Papadimitriou
        vm_id_for_element: function(el) {
169 8d08f18a Kostas Papadimitriou
            return el.attr('id').replace("single-vm-", "");
170 8d08f18a Kostas Papadimitriou
        },
171 8d08f18a Kostas Papadimitriou
        
172 8d08f18a Kostas Papadimitriou
        // set generic view handlers
173 8d08f18a Kostas Papadimitriou
        set_handlers: function() {
174 8d08f18a Kostas Papadimitriou
            this.prev_button.click(_.bind(function(ev){
175 122850c5 Kostas Papadimitriou
                storage.vms.reset_pending_actions();
176 8d08f18a Kostas Papadimitriou
                ev.preventDefault();
177 8d08f18a Kostas Papadimitriou
                this.show_prev();
178 8d08f18a Kostas Papadimitriou
            }, this));
179 8d08f18a Kostas Papadimitriou
180 8d08f18a Kostas Papadimitriou
            this.next_button.click(_.bind(function(ev){
181 122850c5 Kostas Papadimitriou
                storage.vms.reset_pending_actions();
182 8d08f18a Kostas Papadimitriou
                ev.preventDefault();
183 8d08f18a Kostas Papadimitriou
                this.show_next();
184 8d08f18a Kostas Papadimitriou
            }, this));
185 8d08f18a Kostas Papadimitriou
        },  
186 8d08f18a Kostas Papadimitriou
187 8d08f18a Kostas Papadimitriou
        update_current_vm: function() {
188 8d08f18a Kostas Papadimitriou
            try {
189 8d08f18a Kostas Papadimitriou
                this.current_vm_instance = storage.vms.at(this.current_vm);
190 1f7ea2f5 Kostas Papadimitriou
                this.current_vm_instance.start_stats_update(true);
191 2c9bfad1 Kostas Papadimitriou
                storage.vms.stop_stats_update([this.current_vm_instance]);
192 8d08f18a Kostas Papadimitriou
            } catch (err) {
193 8d08f18a Kostas Papadimitriou
                this.log.debug("Cannot select current vm instance for: {0}".format(this.current_vm));
194 643de8c0 Kostas Papadimitriou
                this.current_vm_instance = undefined;
195 643de8c0 Kostas Papadimitriou
                this.current_vm = 0;
196 8d08f18a Kostas Papadimitriou
            }
197 8d08f18a Kostas Papadimitriou
        },
198 8d08f18a Kostas Papadimitriou
199 8d08f18a Kostas Papadimitriou
        show_next: function() {
200 8d08f18a Kostas Papadimitriou
            this.current_vm++;
201 404ccab2 Kostas Papadimitriou
            if (this.current_vm >= storage.vms.models.length) {
202 8d08f18a Kostas Papadimitriou
                this.current_vm = 0;
203 8d08f18a Kostas Papadimitriou
            }
204 38dc3895 Kostas Papadimitriou
            
205 8d08f18a Kostas Papadimitriou
            this.update_current_vm();
206 8fcbacbb Kostas Papadimitriou
207 8fcbacbb Kostas Papadimitriou
            // this might fail when vms get empty
208 8fcbacbb Kostas Papadimitriou
            // catch the exception
209 8fcbacbb Kostas Papadimitriou
            try {
210 8fcbacbb Kostas Papadimitriou
                snf.router.vm_details_view(this.current_vm_instance.id);
211 8fcbacbb Kostas Papadimitriou
            } catch (err) {};
212 8d08f18a Kostas Papadimitriou
        },
213 8d08f18a Kostas Papadimitriou
214 8d08f18a Kostas Papadimitriou
        show_prev: function() {
215 8d08f18a Kostas Papadimitriou
            this.current_vm--;
216 8d08f18a Kostas Papadimitriou
            if (this.current_vm < 0) {
217 8d08f18a Kostas Papadimitriou
                this.current_vm = storage.vms.length - 1;
218 8d08f18a Kostas Papadimitriou
            }
219 38dc3895 Kostas Papadimitriou
220 8d08f18a Kostas Papadimitriou
            this.update_current_vm();
221 38dc3895 Kostas Papadimitriou
            snf.router.vm_details_view(this.current_vm_instance.id);
222 8d08f18a Kostas Papadimitriou
        },
223 8d08f18a Kostas Papadimitriou
224 8d08f18a Kostas Papadimitriou
        post_remove_vm: function(vm) {
225 8d08f18a Kostas Papadimitriou
            // current vm removed or does not exist after an update
226 8d08f18a Kostas Papadimitriou
            this.show_vm_menu();
227 8d08f18a Kostas Papadimitriou
            if (!this.current_vm_instance || this.current_vm_instance.id == vm.id) {
228 dc3eaaee Kostas Papadimitriou
                this.current_vm++;
229 dc3eaaee Kostas Papadimitriou
                if (this.current_vm >= storage.vms.models.length) {
230 dc3eaaee Kostas Papadimitriou
                    this.current_vm = 0;
231 dc3eaaee Kostas Papadimitriou
                }
232 dc3eaaee Kostas Papadimitriou
                this.update_current_vm();
233 dc3eaaee Kostas Papadimitriou
                this.show_current();
234 dc3eaaee Kostas Papadimitriou
            // this might fail when vms get empty
235 dc3eaaee Kostas Papadimitriou
            // catch the exception
236 8d08f18a Kostas Papadimitriou
            } else {
237 8d08f18a Kostas Papadimitriou
                this.show_current();
238 8d08f18a Kostas Papadimitriou
            }
239 8d08f18a Kostas Papadimitriou
        },
240 8d08f18a Kostas Papadimitriou
        
241 8d08f18a Kostas Papadimitriou
        // stuff to do when a new vm has been created.
242 8d08f18a Kostas Papadimitriou
        // - create vm subviews
243 8d08f18a Kostas Papadimitriou
        post_add: function(vm) {
244 8e701482 Kostas Papadimitriou
            this.vm(vm).removeClass("single-container-template");
245 2ab5aa9a Kostas Papadimitriou
            this.show_vm_menu();
246 2ab5aa9a Kostas Papadimitriou
            this.show_current();
247 2ab5aa9a Kostas Papadimitriou
248 8d08f18a Kostas Papadimitriou
            // rename views index
249 8d08f18a Kostas Papadimitriou
            this.stats_views = this.stats_views || {};
250 8d08f18a Kostas Papadimitriou
            this.connect_views = this.connect_views || {};
251 8d08f18a Kostas Papadimitriou
            this.tags_views = this.tags_views || {};
252 8d08f18a Kostas Papadimitriou
            this.details_views = this.details_views || {};
253 8d08f18a Kostas Papadimitriou
            this.action_views = this.action_views || {};
254 6a3a5bf7 Kostas Papadimitriou
            this.action_error_views = this.action_error_views || {};
255 32a58fdf Kostas Papadimitriou
            this.ports_views = this.ports_views || {};
256 8d08f18a Kostas Papadimitriou
257 8d08f18a Kostas Papadimitriou
            //this.stats_views[vm.id] = new views.IconStatsView(vm, this);
258 8d08f18a Kostas Papadimitriou
259 8d08f18a Kostas Papadimitriou
            // same as icon view
260 8d08f18a Kostas Papadimitriou
            this.action_views[vm.id] = new views.VMActionsView(vm, this, this.vm(vm), this.hide_actions);
261 8d08f18a Kostas Papadimitriou
            this.stats_views[vm.id] = new views.VMStatsView(vm, this, {stats_type: 'series'});
262 550d9733 Kostas Papadimitriou
            this.connect_views[vm.id] = new views.IconVMConnectView(vm, this);
263 8d08f18a Kostas Papadimitriou
            this.tags_views[vm.id] = new views.VMTagsView(vm, this, true, 20, 10, 35);
264 8d08f18a Kostas Papadimitriou
            this.details_views[vm.id] = new views.SingleDetailsView(vm, this);
265 6a3a5bf7 Kostas Papadimitriou
            this.action_error_views[vm.id] = new views.VMActionErrorView(vm, this);
266 32a58fdf Kostas Papadimitriou
267 32a58fdf Kostas Papadimitriou
            var ports_container = this.vm(vm).find(".ips-content");
268 32a58fdf Kostas Papadimitriou
            var ports_toggler = this.vm(vm).find(".toggler-header.ips");
269 32a58fdf Kostas Papadimitriou
            
270 32a58fdf Kostas Papadimitriou
            var ports_view = new views.VMSinglePortListView({
271 32a58fdf Kostas Papadimitriou
              vm_view: this.vm(vm),
272 32a58fdf Kostas Papadimitriou
              collection: vm.ports, 
273 32a58fdf Kostas Papadimitriou
              container: ports_container,
274 6201f0e3 Kostas Papadimitriou
              parent: this,
275 807a0305 Kostas Papadimitriou
              truncate: 50
276 32a58fdf Kostas Papadimitriou
            });
277 32a58fdf Kostas Papadimitriou
            this.ports_views[vm.id] = ports_view
278 32a58fdf Kostas Papadimitriou
            ports_view.show();
279 32a58fdf Kostas Papadimitriou
            ports_view.el.hide();
280 44dd6b92 Kostas Papadimitriou
            
281 44dd6b92 Kostas Papadimitriou
            if (storage.vms.models.length > 1) { this.vm(vm).hide(); };
282 8d08f18a Kostas Papadimitriou
        },
283 8d08f18a Kostas Papadimitriou
284 8d08f18a Kostas Papadimitriou
        post_update_vm: function(vm) {
285 8d08f18a Kostas Papadimitriou
        },
286 8d08f18a Kostas Papadimitriou
        
287 8d08f18a Kostas Papadimitriou
        // vm specific event handlers
288 8d08f18a Kostas Papadimitriou
        set_vm_handlers: function(vm) {
289 8d08f18a Kostas Papadimitriou
        },
290 8d08f18a Kostas Papadimitriou
        
291 8d08f18a Kostas Papadimitriou
        // handle selected vm
292 8d08f18a Kostas Papadimitriou
        show_current: function() {
293 8d08f18a Kostas Papadimitriou
            var index = this.current_vm;
294 2ab5aa9a Kostas Papadimitriou
            var vm = storage.vms.at(index);
295 2ab5aa9a Kostas Papadimitriou
296 8d08f18a Kostas Papadimitriou
            this.$(".server-name").removeClass("column3-selected");
297 8d08f18a Kostas Papadimitriou
            
298 2ab5aa9a Kostas Papadimitriou
            if (vm) {
299 2ab5aa9a Kostas Papadimitriou
                this.vm(vm).show();
300 2ab5aa9a Kostas Papadimitriou
            };
301 2ab5aa9a Kostas Papadimitriou
302 2ab5aa9a Kostas Papadimitriou
            _.each(storage.vms.models, function(vmo){
303 2ab5aa9a Kostas Papadimitriou
                if (vm && (vm.id != vmo.id)) {
304 75331d54 Kostas Papadimitriou
                    if (!hasKey.call(this._vm_els, vmo.id)) { return };
305 2ab5aa9a Kostas Papadimitriou
                    this.vm(vmo).hide();
306 2ab5aa9a Kostas Papadimitriou
                }
307 8d08f18a Kostas Papadimitriou
            }, this)
308 8d08f18a Kostas Papadimitriou
309 8d08f18a Kostas Papadimitriou
            if (!vm) {
310 8d08f18a Kostas Papadimitriou
                // empty list
311 8d7e1e38 Kostas Papadimitriou
                this.$(".column3").hide();
312 8d08f18a Kostas Papadimitriou
                return;
313 8d08f18a Kostas Papadimitriou
            }
314 8d7e1e38 Kostas Papadimitriou
            this.$(".column3").show();
315 8d08f18a Kostas Papadimitriou
316 8d08f18a Kostas Papadimitriou
317 23a3bb8e Kostas Papadimitriou
            $("#" + this.link_id_tpl + this.current_vm).addClass("column3-selected");
318 44660f58 Kostas Papadimitriou
            try {
319 44660f58 Kostas Papadimitriou
                this.update_details(vm);
320 44660f58 Kostas Papadimitriou
            } catch (err) {};
321 8d08f18a Kostas Papadimitriou
        },
322 8d08f18a Kostas Papadimitriou
323 8d08f18a Kostas Papadimitriou
        show_vm_menu: function() {
324 8d08f18a Kostas Papadimitriou
            this.menu.find(".server-name").remove();
325 8d08f18a Kostas Papadimitriou
326 8d08f18a Kostas Papadimitriou
            _.each(storage.vms.models, function(vm, index) {
327 dccebcff Kostas Papadimitriou
                var el = $('<div class="server-name" id="'+this.link_id_tpl + index +'">' + 
328 dccebcff Kostas Papadimitriou
                               util.truncate(vm.escape("name"),16)+'</div>')
329 dccebcff Kostas Papadimitriou
                this.menu.append(el);
330 dccebcff Kostas Papadimitriou
331 dccebcff Kostas Papadimitriou
                vm.bind("change:name", function(){
332 dccebcff Kostas Papadimitriou
                  el.html(util.truncate(vm.escape("name"), 16));
333 dccebcff Kostas Papadimitriou
                })
334 dccebcff Kostas Papadimitriou
335 8d08f18a Kostas Papadimitriou
                if (this.current_vm_instance && vm.id == this.current_vm_instance.id) {
336 8d08f18a Kostas Papadimitriou
                    this.current_vm = index;
337 8d08f18a Kostas Papadimitriou
                }
338 8d08f18a Kostas Papadimitriou
            }, this);
339 8d08f18a Kostas Papadimitriou
            
340 8d08f18a Kostas Papadimitriou
            var self = this;
341 8d08f18a Kostas Papadimitriou
            this.menu.find(".server-name").click(function(ev) {
342 8d08f18a Kostas Papadimitriou
                ev.preventDefault();
343 8d08f18a Kostas Papadimitriou
                var id = $(this).attr("id").replace("single-vm-at-", "");
344 1c1f838e Kostas Papadimitriou
                if (self.current_vm != id) {
345 1c1f838e Kostas Papadimitriou
                    storage.vms.reset_pending_actions();
346 1c1f838e Kostas Papadimitriou
                }
347 8d08f18a Kostas Papadimitriou
                self.current_vm = id;
348 8d08f18a Kostas Papadimitriou
                self.update_current_vm();
349 38dc3895 Kostas Papadimitriou
                snf.router.vm_details_view(self.current_vm_instance.id);
350 8d08f18a Kostas Papadimitriou
            })
351 8d08f18a Kostas Papadimitriou
        },
352 8d08f18a Kostas Papadimitriou
353 8d08f18a Kostas Papadimitriou
        // generic stuff to do on each view update
354 8d08f18a Kostas Papadimitriou
        // called once after each vm has been updated
355 8d08f18a Kostas Papadimitriou
        update_layout: function() {
356 8d08f18a Kostas Papadimitriou
            this.update_current_vm();
357 8d08f18a Kostas Papadimitriou
            fix_v6_addresses();
358 8d08f18a Kostas Papadimitriou
        },
359 8d08f18a Kostas Papadimitriou
360 1e882dd7 Kostas Papadimitriou
        update_status_message: function(vm) {
361 1e882dd7 Kostas Papadimitriou
            var el = this.vm(vm);
362 1e882dd7 Kostas Papadimitriou
            var message = vm.get_status_message();
363 1e882dd7 Kostas Papadimitriou
            if (message) {
364 1e882dd7 Kostas Papadimitriou
                // update bulding progress
365 1e882dd7 Kostas Papadimitriou
                el.find("div.machine-ips").hide();
366 1e882dd7 Kostas Papadimitriou
                el.find("div.build-progress").show();
367 1e882dd7 Kostas Papadimitriou
                el.find("div.build-progress .message").text(message);
368 1e882dd7 Kostas Papadimitriou
                if (vm.in_error_state()) {
369 1e882dd7 Kostas Papadimitriou
                    el.find("div.build-progress .btn").show();
370 1e882dd7 Kostas Papadimitriou
                } else {
371 1e882dd7 Kostas Papadimitriou
                    el.find("div.build-progress .btn").hide();
372 1e882dd7 Kostas Papadimitriou
                }
373 1e882dd7 Kostas Papadimitriou
            } else {
374 1e882dd7 Kostas Papadimitriou
                // hide building progress
375 1e882dd7 Kostas Papadimitriou
                el.find("div.machine-ips").show()
376 1e882dd7 Kostas Papadimitriou
                el.find("div.build-progress").hide();
377 1e882dd7 Kostas Papadimitriou
                el.find("div.build-progress .btn").hide();
378 1e882dd7 Kostas Papadimitriou
            }
379 1e882dd7 Kostas Papadimitriou
        },
380 1e882dd7 Kostas Papadimitriou
381 8d08f18a Kostas Papadimitriou
        // update vm details
382 8d08f18a Kostas Papadimitriou
        update_details: function(vm) {
383 8d08f18a Kostas Papadimitriou
            var el = this.vm(vm);
384 44660f58 Kostas Papadimitriou
            if (vm != this.current_vm_instance) { return };
385 44660f58 Kostas Papadimitriou
386 8d08f18a Kostas Papadimitriou
            // truncate name
387 807a0305 Kostas Papadimitriou
            el.find(".machine-detail.name").text(util.truncate(vm.get("name"), 53));
388 6fe8c2ca Kostas Papadimitriou
            el.find(".fqdn").text(vm.get("fqdn") || synnefo.confi.no_fqdn_message);
389 8d08f18a Kostas Papadimitriou
            // set the state (i18n ??)
390 8d08f18a Kostas Papadimitriou
            el.find(".state-label").text(STATE_TEXTS[vm.state()]);
391 8d08f18a Kostas Papadimitriou
            // set state class
392 8d08f18a Kostas Papadimitriou
            el.find(".state").removeClass().addClass(views.SingleView.STATE_CLASSES[vm.state()].join(" "));
393 8d08f18a Kostas Papadimitriou
            // os icon
394 8d08f18a Kostas Papadimitriou
            el.find(".single-image").css({'background-image': "url(" + this.get_vm_icon_path(vm, "medium") + ")"});
395 8d08f18a Kostas Papadimitriou
            
396 8d08f18a Kostas Papadimitriou
            el.removeClass("connectable");
397 8d08f18a Kostas Papadimitriou
            if (vm.is_connectable()) {
398 8d08f18a Kostas Papadimitriou
                el.addClass("connectable");
399 8d08f18a Kostas Papadimitriou
            }
400 8d08f18a Kostas Papadimitriou
401 1e882dd7 Kostas Papadimitriou
            this.update_status_message(vm);
402 8d08f18a Kostas Papadimitriou
403 8d08f18a Kostas Papadimitriou
            icon_state = vm.is_active() ? "on" : "off";
404 8d08f18a Kostas Papadimitriou
            set_machine_os_image(el, "single", icon_state, this.get_vm_icon_os(vm));
405 8d08f18a Kostas Papadimitriou
            
406 8d08f18a Kostas Papadimitriou
            // update subviews
407 8d08f18a Kostas Papadimitriou
            this.action_views[vm.id].update_layout();
408 8d08f18a Kostas Papadimitriou
            this.stats_views[vm.id].update_layout();
409 8d08f18a Kostas Papadimitriou
            this.connect_views[vm.id].update_layout();
410 8d08f18a Kostas Papadimitriou
            this.tags_views[vm.id].update_layout();
411 8d08f18a Kostas Papadimitriou
            this.details_views[vm.id].update_layout();
412 8d08f18a Kostas Papadimitriou
        },
413 8d08f18a Kostas Papadimitriou
            
414 8d08f18a Kostas Papadimitriou
        get_vm_icon_os: function(vm) {
415 8d08f18a Kostas Papadimitriou
            var os = vm.get_os();
416 8d08f18a Kostas Papadimitriou
            var icons = window.os_icons || views.SingleView.VM_OS_ICONS;
417 8d08f18a Kostas Papadimitriou
            if (icons.indexOf(os) == -1) {
418 8d08f18a Kostas Papadimitriou
                os = "unknown";
419 8d08f18a Kostas Papadimitriou
            }
420 8d08f18a Kostas Papadimitriou
            return os;
421 8d08f18a Kostas Papadimitriou
        },
422 8d08f18a Kostas Papadimitriou
423 8d08f18a Kostas Papadimitriou
        // TODO: move to views.utils (the method and the VM_OS_ICON vars)
424 8d08f18a Kostas Papadimitriou
        get_vm_icon_path: function(vm, icon_type) {
425 8d08f18a Kostas Papadimitriou
            var os = vm.get_os();
426 8d08f18a Kostas Papadimitriou
            var icons = window.os_icons || views.SingleView.VM_OS_ICONS;
427 8d08f18a Kostas Papadimitriou
428 8d08f18a Kostas Papadimitriou
            if (icons.indexOf(os) == -1) {
429 8d08f18a Kostas Papadimitriou
                os = "unknown";
430 8d08f18a Kostas Papadimitriou
            }
431 8d08f18a Kostas Papadimitriou
432 c62c6b91 Kostas Papadimitriou
            return views.SingleView.VM_OS_ICON_TPLS()[icon_type].format(os);
433 8d08f18a Kostas Papadimitriou
        }
434 8d08f18a Kostas Papadimitriou
    })
435 8d08f18a Kostas Papadimitriou
436 c62c6b91 Kostas Papadimitriou
    views.SingleView.VM_OS_ICON_TPLS = function() {
437 c62c6b91 Kostas Papadimitriou
        return {
438 c62c6b91 Kostas Papadimitriou
            "medium": snf.config.machines_icons_url + "large/{0}-sprite.png"
439 c62c6b91 Kostas Papadimitriou
        }
440 8d08f18a Kostas Papadimitriou
    }
441 8d08f18a Kostas Papadimitriou
442 8d08f18a Kostas Papadimitriou
    views.SingleView.VM_OS_ICONS = window.os_icons || [];
443 8d08f18a Kostas Papadimitriou
444 8d08f18a Kostas Papadimitriou
    views.SingleView.STATE_CLASSES = {
445 8d08f18a Kostas Papadimitriou
        'UNKNOWN':          ['state', 'error-state'],
446 8d08f18a Kostas Papadimitriou
        'BUILD':            ['state', 'build-state'],
447 8d08f18a Kostas Papadimitriou
        'REBOOT':           ['state', 'rebooting-state'],
448 8d08f18a Kostas Papadimitriou
        'STOPPED':          ['state', 'terminated-state'],
449 8d08f18a Kostas Papadimitriou
        'ACTIVE':           ['state', 'running-state'],
450 8d08f18a Kostas Papadimitriou
        'ERROR':            ['state', 'error-state'],
451 a3ac649e Kostas Papadimitriou
        'DELETED':          ['state', 'destroying-state'],
452 8d08f18a Kostas Papadimitriou
        'DESTROY':          ['state', 'destroying-state'],
453 8d08f18a Kostas Papadimitriou
        'SHUTDOWN':         ['state', 'shutting-state'],
454 8d08f18a Kostas Papadimitriou
        'START':            ['state', 'starting-state'],
455 8d08f18a Kostas Papadimitriou
        'CONNECT':          ['state', 'connecting-state'],
456 a3ac649e Kostas Papadimitriou
        'DISCONNECT':       ['state', 'disconnecting-state'],
457 a3ac649e Kostas Papadimitriou
        'RESIZE':           ['state', 'rebooting-state']
458 8d08f18a Kostas Papadimitriou
    };
459 8d08f18a Kostas Papadimitriou
460 8d08f18a Kostas Papadimitriou
})(this);