Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / ui / static / snf / js / ui / web / ui_single_view.js @ 9555268a

History | View | Annotate | Download (14.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 75331d54 Kostas Papadimitriou
53 8d08f18a Kostas Papadimitriou
    views.SingleDetailsView = views.VMDetailsView.extend({
54 8d08f18a Kostas Papadimitriou
    
55 8d08f18a Kostas Papadimitriou
        view_id: "vm_details_single",
56 8d08f18a Kostas Papadimitriou
        el_sel: '.machine-details',
57 8d08f18a Kostas Papadimitriou
        
58 8d08f18a Kostas Papadimitriou
        selectors: {
59 8d08f18a Kostas Papadimitriou
            'cpu': '.machine-detail.cpus',
60 8d08f18a Kostas Papadimitriou
            'ram': '.machine-detail.ram',
61 8d08f18a Kostas Papadimitriou
            'disk': '.machine-detail.disk',
62 8d08f18a Kostas Papadimitriou
            'image_name': '.machine-detail.image-name',
63 8d08f18a Kostas Papadimitriou
            'image_size': '.machine-detail.image-size'
64 8d08f18a Kostas Papadimitriou
        }
65 8d08f18a Kostas Papadimitriou
    
66 8d08f18a Kostas Papadimitriou
    })
67 8d08f18a Kostas Papadimitriou
68 8d08f18a Kostas Papadimitriou
    // VMs single view
69 8d08f18a Kostas Papadimitriou
    views.SingleView = views.VMListView.extend({
70 8d08f18a Kostas Papadimitriou
        
71 8d08f18a Kostas Papadimitriou
        // view id (this could be used to identify 
72 8d08f18a Kostas Papadimitriou
        // the view object from global context
73 8d08f18a Kostas Papadimitriou
        view_id: 'vm_single',
74 8d08f18a Kostas Papadimitriou
75 8d08f18a Kostas Papadimitriou
        el: '#machinesview-single',
76 23a3bb8e Kostas Papadimitriou
        id_tpl: 'single-vm-',
77 23a3bb8e Kostas Papadimitriou
        link_id_tpl: 'single-vm-at-',
78 8d08f18a Kostas Papadimitriou
79 8d08f18a Kostas Papadimitriou
        hide_actions: false,
80 8d08f18a Kostas Papadimitriou
81 8d08f18a Kostas Papadimitriou
        selectors: {
82 8d08f18a Kostas Papadimitriou
            'vms': '.single-container',
83 75331d54 Kostas Papadimitriou
            'vm': '#single-vm-',
84 8d08f18a Kostas Papadimitriou
            'view': '#machinesview-single',
85 8e701482 Kostas Papadimitriou
            'tpl': '.single-container-template',
86 8d08f18a Kostas Papadimitriou
            'spinner': '.large-spinner',
87 75331d54 Kostas Papadimitriou
            'vm_spinner': '#single-vm-{0} .state .spinner',
88 75331d54 Kostas Papadimitriou
            'vm_wave': '#single-vm-{0} img.wave',
89 8d08f18a Kostas Papadimitriou
            'vm_cont_active': '#machinesview-single',
90 8d08f18a Kostas Papadimitriou
            'vm_cont_terminated': '#machinesview-single'
91 8d08f18a Kostas Papadimitriou
        },
92 8d08f18a Kostas Papadimitriou
        
93 8d08f18a Kostas Papadimitriou
        initialize: function() {
94 8d08f18a Kostas Papadimitriou
            this.current_vm = 0;
95 8d08f18a Kostas Papadimitriou
            
96 8d08f18a Kostas Papadimitriou
            // button selectors
97 8d08f18a Kostas Papadimitriou
            this.prev_button = this.$(".controls .previous");
98 8d08f18a Kostas Papadimitriou
            this.next_button = this.$(".controls .next");
99 8d08f18a Kostas Papadimitriou
            this.menu = $("#single-servers-list");
100 8d08f18a Kostas Papadimitriou
101 8d08f18a Kostas Papadimitriou
            views.SingleView.__super__.initialize.apply(this, arguments);
102 c343513e Kostas Papadimitriou
            this.update_current_vm();
103 8d08f18a Kostas Papadimitriou
        },
104 8d08f18a Kostas Papadimitriou
105 8d08f18a Kostas Papadimitriou
        // overload show function
106 2ab5aa9a Kostas Papadimitriou
        show: function() {
107 2ab5aa9a Kostas Papadimitriou
            views.SingleView.__super__.show.apply(this, arguments);
108 8d08f18a Kostas Papadimitriou
            this.log.debug("showing");
109 8d08f18a Kostas Papadimitriou
            this.$(".column3").show();
110 2ab5aa9a Kostas Papadimitriou
            this.show_vm_menu();
111 2ab5aa9a Kostas Papadimitriou
            this.show_current();
112 8d08f18a Kostas Papadimitriou
        },
113 8d08f18a Kostas Papadimitriou
114 8d08f18a Kostas Papadimitriou
        show_vm: function(vm) {
115 513eafb4 Kostas Papadimitriou
            if (!vm) { return };
116 8d08f18a Kostas Papadimitriou
            this.current_vm_instance = vm;
117 8d08f18a Kostas Papadimitriou
            this.show_vm_menu();
118 8d08f18a Kostas Papadimitriou
            this.show_current();
119 8d08f18a Kostas Papadimitriou
            this.update_layout();
120 8d08f18a Kostas Papadimitriou
        },
121 8d08f18a Kostas Papadimitriou
122 8d08f18a Kostas Papadimitriou
        // identify vm model instance id based on DOM element
123 8d08f18a Kostas Papadimitriou
        vm_id_for_element: function(el) {
124 8d08f18a Kostas Papadimitriou
            return el.attr('id').replace("single-vm-", "");
125 8d08f18a Kostas Papadimitriou
        },
126 8d08f18a Kostas Papadimitriou
        
127 8d08f18a Kostas Papadimitriou
        // set generic view handlers
128 8d08f18a Kostas Papadimitriou
        set_handlers: function() {
129 8d08f18a Kostas Papadimitriou
            this.prev_button.click(_.bind(function(ev){
130 122850c5 Kostas Papadimitriou
                storage.vms.reset_pending_actions();
131 8d08f18a Kostas Papadimitriou
                ev.preventDefault();
132 8d08f18a Kostas Papadimitriou
                this.show_prev();
133 8d08f18a Kostas Papadimitriou
            }, this));
134 8d08f18a Kostas Papadimitriou
135 8d08f18a Kostas Papadimitriou
            this.next_button.click(_.bind(function(ev){
136 122850c5 Kostas Papadimitriou
                storage.vms.reset_pending_actions();
137 8d08f18a Kostas Papadimitriou
                ev.preventDefault();
138 8d08f18a Kostas Papadimitriou
                this.show_next();
139 8d08f18a Kostas Papadimitriou
            }, this));
140 8d08f18a Kostas Papadimitriou
        },  
141 8d08f18a Kostas Papadimitriou
142 8d08f18a Kostas Papadimitriou
        update_current_vm: function() {
143 8d08f18a Kostas Papadimitriou
            try {
144 8d08f18a Kostas Papadimitriou
                this.current_vm_instance = storage.vms.at(this.current_vm);
145 1f7ea2f5 Kostas Papadimitriou
                this.current_vm_instance.start_stats_update(true);
146 2c9bfad1 Kostas Papadimitriou
                storage.vms.stop_stats_update([this.current_vm_instance]);
147 8d08f18a Kostas Papadimitriou
            } catch (err) {
148 8d08f18a Kostas Papadimitriou
                this.log.debug("Cannot select current vm instance for: {0}".format(this.current_vm));
149 643de8c0 Kostas Papadimitriou
                this.current_vm_instance = undefined;
150 643de8c0 Kostas Papadimitriou
                this.current_vm = 0;
151 8d08f18a Kostas Papadimitriou
            }
152 8d08f18a Kostas Papadimitriou
        },
153 8d08f18a Kostas Papadimitriou
154 8d08f18a Kostas Papadimitriou
        show_next: function() {
155 8d08f18a Kostas Papadimitriou
            this.current_vm++;
156 404ccab2 Kostas Papadimitriou
            if (this.current_vm >= storage.vms.models.length) {
157 8d08f18a Kostas Papadimitriou
                this.current_vm = 0;
158 8d08f18a Kostas Papadimitriou
            }
159 38dc3895 Kostas Papadimitriou
            
160 8d08f18a Kostas Papadimitriou
            this.update_current_vm();
161 8fcbacbb Kostas Papadimitriou
162 8fcbacbb Kostas Papadimitriou
            // this might fail when vms get empty
163 8fcbacbb Kostas Papadimitriou
            // catch the exception
164 8fcbacbb Kostas Papadimitriou
            try {
165 8fcbacbb Kostas Papadimitriou
                snf.router.vm_details_view(this.current_vm_instance.id);
166 8fcbacbb Kostas Papadimitriou
            } catch (err) {};
167 8d08f18a Kostas Papadimitriou
        },
168 8d08f18a Kostas Papadimitriou
169 8d08f18a Kostas Papadimitriou
        show_prev: function() {
170 8d08f18a Kostas Papadimitriou
            this.current_vm--;
171 8d08f18a Kostas Papadimitriou
            if (this.current_vm < 0) {
172 8d08f18a Kostas Papadimitriou
                this.current_vm = storage.vms.length - 1;
173 8d08f18a Kostas Papadimitriou
            }
174 38dc3895 Kostas Papadimitriou
175 8d08f18a Kostas Papadimitriou
            this.update_current_vm();
176 38dc3895 Kostas Papadimitriou
            snf.router.vm_details_view(this.current_vm_instance.id);
177 8d08f18a Kostas Papadimitriou
        },
178 8d08f18a Kostas Papadimitriou
179 8d08f18a Kostas Papadimitriou
        post_remove_vm: function(vm) {
180 8d08f18a Kostas Papadimitriou
            // current vm removed or does not exist after an update
181 8d08f18a Kostas Papadimitriou
            this.show_vm_menu();
182 8d08f18a Kostas Papadimitriou
            if (!this.current_vm_instance || this.current_vm_instance.id == vm.id) {
183 dc3eaaee Kostas Papadimitriou
                this.current_vm++;
184 dc3eaaee Kostas Papadimitriou
                if (this.current_vm >= storage.vms.models.length) {
185 dc3eaaee Kostas Papadimitriou
                    this.current_vm = 0;
186 dc3eaaee Kostas Papadimitriou
                }
187 dc3eaaee Kostas Papadimitriou
                this.update_current_vm();
188 dc3eaaee Kostas Papadimitriou
                this.show_current();
189 dc3eaaee Kostas Papadimitriou
            // this might fail when vms get empty
190 dc3eaaee Kostas Papadimitriou
            // catch the exception
191 8d08f18a Kostas Papadimitriou
            } else {
192 8d08f18a Kostas Papadimitriou
                this.show_current();
193 8d08f18a Kostas Papadimitriou
            }
194 8d08f18a Kostas Papadimitriou
        },
195 8d08f18a Kostas Papadimitriou
        
196 8d08f18a Kostas Papadimitriou
        // stuff to do when a new vm has been created.
197 8d08f18a Kostas Papadimitriou
        // - create vm subviews
198 8d08f18a Kostas Papadimitriou
        post_add: function(vm) {
199 8e701482 Kostas Papadimitriou
            this.vm(vm).removeClass("single-container-template");
200 2ab5aa9a Kostas Papadimitriou
            this.show_vm_menu();
201 2ab5aa9a Kostas Papadimitriou
            this.show_current();
202 2ab5aa9a Kostas Papadimitriou
203 8d08f18a Kostas Papadimitriou
            // rename views index
204 8d08f18a Kostas Papadimitriou
            this.stats_views = this.stats_views || {};
205 8d08f18a Kostas Papadimitriou
            this.connect_views = this.connect_views || {};
206 8d08f18a Kostas Papadimitriou
            this.tags_views = this.tags_views || {};
207 8d08f18a Kostas Papadimitriou
            this.details_views = this.details_views || {};
208 8d08f18a Kostas Papadimitriou
            this.action_views = this.action_views || {};
209 6a3a5bf7 Kostas Papadimitriou
            this.action_error_views = this.action_error_views || {};
210 8d08f18a Kostas Papadimitriou
211 8d08f18a Kostas Papadimitriou
            //this.stats_views[vm.id] = new views.IconStatsView(vm, this);
212 8d08f18a Kostas Papadimitriou
213 8d08f18a Kostas Papadimitriou
            // same as icon view
214 8d08f18a Kostas Papadimitriou
            this.action_views[vm.id] = new views.VMActionsView(vm, this, this.vm(vm), this.hide_actions);
215 8d08f18a Kostas Papadimitriou
            this.stats_views[vm.id] = new views.VMStatsView(vm, this, {stats_type: 'series'});
216 550d9733 Kostas Papadimitriou
            this.connect_views[vm.id] = new views.IconVMConnectView(vm, this);
217 8d08f18a Kostas Papadimitriou
            this.tags_views[vm.id] = new views.VMTagsView(vm, this, true, 20, 10, 35);
218 8d08f18a Kostas Papadimitriou
            this.details_views[vm.id] = new views.SingleDetailsView(vm, this);
219 6a3a5bf7 Kostas Papadimitriou
            this.action_error_views[vm.id] = new views.VMActionErrorView(vm, this);
220 44dd6b92 Kostas Papadimitriou
            
221 44dd6b92 Kostas Papadimitriou
            if (storage.vms.models.length > 1) { this.vm(vm).hide(); };
222 8d08f18a Kostas Papadimitriou
        },
223 8d08f18a Kostas Papadimitriou
224 8d08f18a Kostas Papadimitriou
        post_update_vm: function(vm) {
225 8d08f18a Kostas Papadimitriou
        },
226 8d08f18a Kostas Papadimitriou
        
227 8d08f18a Kostas Papadimitriou
        // vm specific event handlers
228 8d08f18a Kostas Papadimitriou
        set_vm_handlers: function(vm) {
229 8d08f18a Kostas Papadimitriou
        },
230 8d08f18a Kostas Papadimitriou
        
231 8d08f18a Kostas Papadimitriou
        // handle selected vm
232 8d08f18a Kostas Papadimitriou
        show_current: function() {
233 8d08f18a Kostas Papadimitriou
            var index = this.current_vm;
234 2ab5aa9a Kostas Papadimitriou
            var vm = storage.vms.at(index);
235 2ab5aa9a Kostas Papadimitriou
236 8d08f18a Kostas Papadimitriou
            this.$(".server-name").removeClass("column3-selected");
237 8d08f18a Kostas Papadimitriou
            
238 2ab5aa9a Kostas Papadimitriou
            if (vm) {
239 2ab5aa9a Kostas Papadimitriou
                this.vm(vm).show();
240 2ab5aa9a Kostas Papadimitriou
            };
241 2ab5aa9a Kostas Papadimitriou
242 2ab5aa9a Kostas Papadimitriou
            _.each(storage.vms.models, function(vmo){
243 2ab5aa9a Kostas Papadimitriou
                if (vm && (vm.id != vmo.id)) {
244 75331d54 Kostas Papadimitriou
                    if (!hasKey.call(this._vm_els, vmo.id)) { return };
245 2ab5aa9a Kostas Papadimitriou
                    this.vm(vmo).hide();
246 2ab5aa9a Kostas Papadimitriou
                }
247 8d08f18a Kostas Papadimitriou
            }, this)
248 8d08f18a Kostas Papadimitriou
249 8d08f18a Kostas Papadimitriou
            if (!vm) {
250 8d08f18a Kostas Papadimitriou
                // empty list
251 8d7e1e38 Kostas Papadimitriou
                this.$(".column3").hide();
252 8d08f18a Kostas Papadimitriou
                return;
253 8d08f18a Kostas Papadimitriou
            }
254 8d7e1e38 Kostas Papadimitriou
            this.$(".column3").show();
255 8d08f18a Kostas Papadimitriou
256 8d08f18a Kostas Papadimitriou
257 23a3bb8e Kostas Papadimitriou
            $("#" + this.link_id_tpl + this.current_vm).addClass("column3-selected");
258 44660f58 Kostas Papadimitriou
            try {
259 44660f58 Kostas Papadimitriou
                this.update_details(vm);
260 44660f58 Kostas Papadimitriou
            } catch (err) {};
261 8d08f18a Kostas Papadimitriou
        },
262 8d08f18a Kostas Papadimitriou
263 8d08f18a Kostas Papadimitriou
        show_vm_menu: function() {
264 8d08f18a Kostas Papadimitriou
            this.menu.find(".server-name").remove();
265 8d08f18a Kostas Papadimitriou
266 8d08f18a Kostas Papadimitriou
            _.each(storage.vms.models, function(vm, index) {
267 23a3bb8e Kostas Papadimitriou
                this.menu.append('<div class="server-name" id="'+this.link_id_tpl + index +'">' + 
268 df251d55 Kostas Papadimitriou
                               util.truncate(vm.escape("name"),16)+'</div>');
269 8d08f18a Kostas Papadimitriou
                if (this.current_vm_instance && vm.id == this.current_vm_instance.id) {
270 8d08f18a Kostas Papadimitriou
                    this.current_vm = index;
271 8d08f18a Kostas Papadimitriou
                }
272 8d08f18a Kostas Papadimitriou
            }, this);
273 8d08f18a Kostas Papadimitriou
            
274 8d08f18a Kostas Papadimitriou
            var self = this;
275 8d08f18a Kostas Papadimitriou
            this.menu.find(".server-name").click(function(ev) {
276 8d08f18a Kostas Papadimitriou
                ev.preventDefault();
277 8d08f18a Kostas Papadimitriou
                var id = $(this).attr("id").replace("single-vm-at-", "");
278 1c1f838e Kostas Papadimitriou
                if (self.current_vm != id) {
279 1c1f838e Kostas Papadimitriou
                    storage.vms.reset_pending_actions();
280 1c1f838e Kostas Papadimitriou
                }
281 8d08f18a Kostas Papadimitriou
                self.current_vm = id;
282 8d08f18a Kostas Papadimitriou
                self.update_current_vm();
283 38dc3895 Kostas Papadimitriou
                snf.router.vm_details_view(self.current_vm_instance.id);
284 8d08f18a Kostas Papadimitriou
            })
285 8d08f18a Kostas Papadimitriou
        },
286 8d08f18a Kostas Papadimitriou
287 8d08f18a Kostas Papadimitriou
        // generic stuff to do on each view update
288 8d08f18a Kostas Papadimitriou
        // called once after each vm has been updated
289 8d08f18a Kostas Papadimitriou
        update_layout: function() {
290 8d08f18a Kostas Papadimitriou
            this.update_current_vm();
291 8d08f18a Kostas Papadimitriou
            fix_v6_addresses();
292 8d08f18a Kostas Papadimitriou
        },
293 8d08f18a Kostas Papadimitriou
294 1e882dd7 Kostas Papadimitriou
        update_status_message: function(vm) {
295 1e882dd7 Kostas Papadimitriou
            var el = this.vm(vm);
296 1e882dd7 Kostas Papadimitriou
            var message = vm.get_status_message();
297 1e882dd7 Kostas Papadimitriou
            if (message) {
298 1e882dd7 Kostas Papadimitriou
                // update bulding progress
299 1e882dd7 Kostas Papadimitriou
                el.find("div.machine-ips").hide();
300 1e882dd7 Kostas Papadimitriou
                el.find("div.build-progress").show();
301 1e882dd7 Kostas Papadimitriou
                el.find("div.build-progress .message").text(message);
302 1e882dd7 Kostas Papadimitriou
                if (vm.in_error_state()) {
303 1e882dd7 Kostas Papadimitriou
                    el.find("div.build-progress .btn").show();
304 1e882dd7 Kostas Papadimitriou
                } else {
305 1e882dd7 Kostas Papadimitriou
                    el.find("div.build-progress .btn").hide();
306 1e882dd7 Kostas Papadimitriou
                }
307 1e882dd7 Kostas Papadimitriou
            } else {
308 1e882dd7 Kostas Papadimitriou
                // hide building progress
309 1e882dd7 Kostas Papadimitriou
                el.find("div.machine-ips").show()
310 1e882dd7 Kostas Papadimitriou
                el.find("div.build-progress").hide();
311 1e882dd7 Kostas Papadimitriou
                el.find("div.build-progress .btn").hide();
312 1e882dd7 Kostas Papadimitriou
            }
313 1e882dd7 Kostas Papadimitriou
        },
314 1e882dd7 Kostas Papadimitriou
315 8d08f18a Kostas Papadimitriou
        // update vm details
316 8d08f18a Kostas Papadimitriou
        update_details: function(vm) {
317 8d08f18a Kostas Papadimitriou
            var el = this.vm(vm);
318 44660f58 Kostas Papadimitriou
            if (vm != this.current_vm_instance) { return };
319 44660f58 Kostas Papadimitriou
320 8d08f18a Kostas Papadimitriou
            // truncate name
321 8d08f18a Kostas Papadimitriou
            el.find(".machine-detail.name").text(util.truncate(vm.get("name"), 35));
322 8d08f18a Kostas Papadimitriou
            // set ips
323 29074c9d Kostas Papadimitriou
            el.find(".machine-detail.ipv4.ipv4-text").text(vm.get_addresses().ip4 || "not set");
324 8d08f18a Kostas Papadimitriou
            // TODO: fix ipv6 truncates and tooltip handler
325 29074c9d Kostas Papadimitriou
            el.find(".machine-detail.ipv6.ipv6-text").text(vm.get_addresses().ip6 || "not set");
326 8d08f18a Kostas Papadimitriou
            // set the state (i18n ??)
327 8d08f18a Kostas Papadimitriou
            el.find(".state-label").text(STATE_TEXTS[vm.state()]);
328 8d08f18a Kostas Papadimitriou
            // set state class
329 8d08f18a Kostas Papadimitriou
            el.find(".state").removeClass().addClass(views.SingleView.STATE_CLASSES[vm.state()].join(" "));
330 8d08f18a Kostas Papadimitriou
            // os icon
331 8d08f18a Kostas Papadimitriou
            el.find(".single-image").css({'background-image': "url(" + this.get_vm_icon_path(vm, "medium") + ")"});
332 8d08f18a Kostas Papadimitriou
            
333 8d08f18a Kostas Papadimitriou
            el.removeClass("connectable");
334 8d08f18a Kostas Papadimitriou
            if (vm.is_connectable()) {
335 8d08f18a Kostas Papadimitriou
                el.addClass("connectable");
336 8d08f18a Kostas Papadimitriou
            }
337 8d08f18a Kostas Papadimitriou
338 1e882dd7 Kostas Papadimitriou
            this.update_status_message(vm);
339 8d08f18a Kostas Papadimitriou
340 8d08f18a Kostas Papadimitriou
            icon_state = vm.is_active() ? "on" : "off";
341 8d08f18a Kostas Papadimitriou
            set_machine_os_image(el, "single", icon_state, this.get_vm_icon_os(vm));
342 8d08f18a Kostas Papadimitriou
            
343 8d08f18a Kostas Papadimitriou
            // update subviews
344 8d08f18a Kostas Papadimitriou
            this.action_views[vm.id].update_layout();
345 8d08f18a Kostas Papadimitriou
            this.stats_views[vm.id].update_layout();
346 8d08f18a Kostas Papadimitriou
            this.connect_views[vm.id].update_layout();
347 8d08f18a Kostas Papadimitriou
            this.tags_views[vm.id].update_layout();
348 8d08f18a Kostas Papadimitriou
            this.details_views[vm.id].update_layout();
349 8d08f18a Kostas Papadimitriou
        },
350 8d08f18a Kostas Papadimitriou
            
351 8d08f18a Kostas Papadimitriou
        get_vm_icon_os: function(vm) {
352 8d08f18a Kostas Papadimitriou
            var os = vm.get_os();
353 8d08f18a Kostas Papadimitriou
            var icons = window.os_icons || views.SingleView.VM_OS_ICONS;
354 8d08f18a Kostas Papadimitriou
            if (icons.indexOf(os) == -1) {
355 8d08f18a Kostas Papadimitriou
                os = "unknown";
356 8d08f18a Kostas Papadimitriou
            }
357 8d08f18a Kostas Papadimitriou
            return os;
358 8d08f18a Kostas Papadimitriou
        },
359 8d08f18a Kostas Papadimitriou
360 8d08f18a Kostas Papadimitriou
        // TODO: move to views.utils (the method and the VM_OS_ICON vars)
361 8d08f18a Kostas Papadimitriou
        get_vm_icon_path: function(vm, icon_type) {
362 8d08f18a Kostas Papadimitriou
            var os = vm.get_os();
363 8d08f18a Kostas Papadimitriou
            var icons = window.os_icons || views.SingleView.VM_OS_ICONS;
364 8d08f18a Kostas Papadimitriou
365 8d08f18a Kostas Papadimitriou
            if (icons.indexOf(os) == -1) {
366 8d08f18a Kostas Papadimitriou
                os = "unknown";
367 8d08f18a Kostas Papadimitriou
            }
368 8d08f18a Kostas Papadimitriou
369 c62c6b91 Kostas Papadimitriou
            return views.SingleView.VM_OS_ICON_TPLS()[icon_type].format(os);
370 8d08f18a Kostas Papadimitriou
        }
371 8d08f18a Kostas Papadimitriou
    })
372 8d08f18a Kostas Papadimitriou
373 c62c6b91 Kostas Papadimitriou
    views.SingleView.VM_OS_ICON_TPLS = function() {
374 c62c6b91 Kostas Papadimitriou
        return {
375 c62c6b91 Kostas Papadimitriou
            "medium": snf.config.machines_icons_url + "large/{0}-sprite.png"
376 c62c6b91 Kostas Papadimitriou
        }
377 8d08f18a Kostas Papadimitriou
    }
378 8d08f18a Kostas Papadimitriou
379 8d08f18a Kostas Papadimitriou
    views.SingleView.VM_OS_ICONS = window.os_icons || [];
380 8d08f18a Kostas Papadimitriou
381 8d08f18a Kostas Papadimitriou
    views.SingleView.STATE_CLASSES = {
382 8d08f18a Kostas Papadimitriou
        'UNKNOWN':          ['state', 'error-state'],
383 8d08f18a Kostas Papadimitriou
        'BUILD':            ['state', 'build-state'],
384 8d08f18a Kostas Papadimitriou
        'REBOOT':           ['state', 'rebooting-state'],
385 8d08f18a Kostas Papadimitriou
        'STOPPED':          ['state', 'terminated-state'],
386 8d08f18a Kostas Papadimitriou
        'ACTIVE':           ['state', 'running-state'],
387 8d08f18a Kostas Papadimitriou
        'ERROR':            ['state', 'error-state'],
388 643de8c0 Kostas Papadimitriou
        'DELETED':           ['state', 'destroying-state'],
389 8d08f18a Kostas Papadimitriou
        'DESTROY':          ['state', 'destroying-state'],
390 8d08f18a Kostas Papadimitriou
        'BUILD_INIT':       ['state', 'build-state'], 
391 8d08f18a Kostas Papadimitriou
        'BUILD_COPY':       ['state', 'build-state'],
392 8d08f18a Kostas Papadimitriou
        'BUILD_FINAL':      ['state', 'build-state'],
393 8d08f18a Kostas Papadimitriou
        'SHUTDOWN':         ['state', 'shutting-state'],
394 8d08f18a Kostas Papadimitriou
        'START':            ['state', 'starting-state'],
395 8d08f18a Kostas Papadimitriou
        'CONNECT':          ['state', 'connecting-state'],
396 8d08f18a Kostas Papadimitriou
        'DISCONNECT':       ['state', 'disconnecting-state']
397 8d08f18a Kostas Papadimitriou
    };
398 8d08f18a Kostas Papadimitriou
399 8d08f18a Kostas Papadimitriou
})(this);