Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / ui / static / snf / js / ui / web / ui_vm_resize_view.js @ 8a6915df

History | View | Annotate | Download (15.8 kB)

1 ab3df8df Kostas Papadimitriou
// Copyright 2013 GRNET S.A. All rights reserved.
2 ab3df8df Kostas Papadimitriou
// 
3 ab3df8df Kostas Papadimitriou
// Redistribution and use in source and binary forms, with or
4 ab3df8df Kostas Papadimitriou
// without modification, are permitted provided that the following
5 ab3df8df Kostas Papadimitriou
// conditions are met:
6 ab3df8df Kostas Papadimitriou
// 
7 ab3df8df Kostas Papadimitriou
//   1. Redistributions of source code must retain the above
8 ab3df8df Kostas Papadimitriou
//      copyright notice, this list of conditions and the following
9 ab3df8df Kostas Papadimitriou
//      disclaimer.
10 ab3df8df Kostas Papadimitriou
// 
11 ab3df8df Kostas Papadimitriou
//   2. Redistributions in binary form must reproduce the above
12 ab3df8df Kostas Papadimitriou
//      copyright notice, this list of conditions and the following
13 ab3df8df Kostas Papadimitriou
//      disclaimer in the documentation and/or other materials
14 ab3df8df Kostas Papadimitriou
//      provided with the distribution.
15 ab3df8df Kostas Papadimitriou
// 
16 ab3df8df Kostas Papadimitriou
// THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 ab3df8df Kostas Papadimitriou
// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 ab3df8df Kostas Papadimitriou
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 ab3df8df Kostas Papadimitriou
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 ab3df8df Kostas Papadimitriou
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 ab3df8df Kostas Papadimitriou
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 ab3df8df Kostas Papadimitriou
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 ab3df8df Kostas Papadimitriou
// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 ab3df8df Kostas Papadimitriou
// AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 ab3df8df Kostas Papadimitriou
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 ab3df8df Kostas Papadimitriou
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 ab3df8df Kostas Papadimitriou
// POSSIBILITY OF SUCH DAMAGE.
28 ab3df8df Kostas Papadimitriou
// 
29 ab3df8df Kostas Papadimitriou
// The views and conclusions contained in the software and
30 ab3df8df Kostas Papadimitriou
// documentation are those of the authors and should not be
31 ab3df8df Kostas Papadimitriou
// interpreted as representing official policies, either expressed
32 ab3df8df Kostas Papadimitriou
// or implied, of GRNET S.A.
33 ab3df8df Kostas Papadimitriou
// 
34 ab3df8df Kostas Papadimitriou
35 ab3df8df Kostas Papadimitriou
;(function(root){
36 ab3df8df Kostas Papadimitriou
37 ab3df8df Kostas Papadimitriou
    // root
38 ab3df8df Kostas Papadimitriou
    var root = root;
39 ab3df8df Kostas Papadimitriou
    
40 ab3df8df Kostas Papadimitriou
    // setup namepsaces
41 ab3df8df Kostas Papadimitriou
    var snf = root.synnefo = root.synnefo || {};
42 ab3df8df Kostas Papadimitriou
    var models = snf.models = snf.models || {}
43 ab3df8df Kostas Papadimitriou
    var storage = snf.storage = snf.storage || {};
44 ab3df8df Kostas Papadimitriou
    var ui = snf.ui = snf.ui || {};
45 ab3df8df Kostas Papadimitriou
    var util = snf.util = snf.util || {};
46 ab3df8df Kostas Papadimitriou
47 ab3df8df Kostas Papadimitriou
    var views = snf.views = snf.views || {}
48 ab3df8df Kostas Papadimitriou
49 ab3df8df Kostas Papadimitriou
    // shortcuts
50 ab3df8df Kostas Papadimitriou
    var bb = root.Backbone;
51 ab3df8df Kostas Papadimitriou
52 ab3df8df Kostas Papadimitriou
    
53 ab3df8df Kostas Papadimitriou
    views.FlavorOptionsView = views.View.extend({
54 ab3df8df Kostas Papadimitriou
55 ab3df8df Kostas Papadimitriou
        choices_meta: {
56 ab3df8df Kostas Papadimitriou
            'cpu': {title: 'CPUs', description: 'Choose number of CPU cores'},
57 ab3df8df Kostas Papadimitriou
            'ram': {title: 'Memory size', description: 'Choose memory size'},
58 ab3df8df Kostas Papadimitriou
            'disk': {title: 'Disk size', description: 'Choose disk size'},
59 ab3df8df Kostas Papadimitriou
            'disk_template': {title: 'Storage', description: 'Select storage type'}
60 ab3df8df Kostas Papadimitriou
        },
61 ab3df8df Kostas Papadimitriou
62 ab3df8df Kostas Papadimitriou
        initialize: function(options) {
63 ab3df8df Kostas Papadimitriou
            views.FlavorOptionsView.__super__.initialize.apply(this);
64 ab3df8df Kostas Papadimitriou
            _.bindAll(this);
65 ab3df8df Kostas Papadimitriou
            this.$el = $(this.el);
66 ab3df8df Kostas Papadimitriou
            this.flavors = options.flavors || synnefo.storage.flavors.active();
67 ab3df8df Kostas Papadimitriou
            this.collection = options.collection || synnefo.storage.flavors;
68 ab3df8df Kostas Papadimitriou
            this.choices = options.choices || ['cpu', 'ram', 'disk', 
69 ab3df8df Kostas Papadimitriou
                                               'disk_template'];
70 ab3df8df Kostas Papadimitriou
            this.hidden_choices = options.hidden_choices || [];
71 ab3df8df Kostas Papadimitriou
            this.quotas = options.quotas || synnefo.storage.quotas;
72 ab3df8df Kostas Papadimitriou
            this.selected_flavor = options.selected_flavor || undefined;
73 ab3df8df Kostas Papadimitriou
            this.extra_quotas = options.extra_quotas || undefined;
74 ab3df8df Kostas Papadimitriou
            this.render();
75 ab3df8df Kostas Papadimitriou
            if (this.selected_flavor) { this.set_flavor(this.selected_flavor)}
76 ab3df8df Kostas Papadimitriou
        },
77 ab3df8df Kostas Papadimitriou
78 ab3df8df Kostas Papadimitriou
        render: function() {
79 ab3df8df Kostas Papadimitriou
            this.$el.empty();
80 ab3df8df Kostas Papadimitriou
            this.each_choice(function(choice) {
81 ab3df8df Kostas Papadimitriou
                var el = this[choice + '_el'] = $("<div>");
82 ab3df8df Kostas Papadimitriou
                el.addClass("flavor-options clearfix");
83 ab3df8df Kostas Papadimitriou
                el.addClass(choice);
84 ab3df8df Kostas Papadimitriou
                var title = $("<h4 class='clearfix'><span class='title'>" + 
85 ab3df8df Kostas Papadimitriou
                              "</span><span class='available'></span>" +
86 ab3df8df Kostas Papadimitriou
                              "<span class='desc'></span></h4>");
87 ab3df8df Kostas Papadimitriou
                el.append(title);
88 ab3df8df Kostas Papadimitriou
                el.find("span.title").text(this.choices_meta[choice].title);
89 ab3df8df Kostas Papadimitriou
                el.find("span.desc").text(this.choices_meta[choice].description);
90 ab3df8df Kostas Papadimitriou
                var ul = $("<ul/>");
91 ab3df8df Kostas Papadimitriou
                ul.addClass("flavors-"+choice+"-list flavor-opts-list clearfix");
92 ab3df8df Kostas Papadimitriou
                el.append(ul);
93 ab3df8df Kostas Papadimitriou
                this.$el.append(el);
94 ab3df8df Kostas Papadimitriou
                if (this.hidden_choices.indexOf(choice) > -1) {
95 ab3df8df Kostas Papadimitriou
                    el.hide();
96 ab3df8df Kostas Papadimitriou
                }
97 ab3df8df Kostas Papadimitriou
            });
98 ab3df8df Kostas Papadimitriou
            this.update_quota_left();
99 ab3df8df Kostas Papadimitriou
            this.fill();
100 ab3df8df Kostas Papadimitriou
            this.set_unavailable();
101 ab3df8df Kostas Papadimitriou
            this.init_handlers();
102 ab3df8df Kostas Papadimitriou
        },
103 ab3df8df Kostas Papadimitriou
        
104 80bb2140 Kostas Papadimitriou
        get_current: function(choice, value) {
105 80bb2140 Kostas Papadimitriou
          var found = false;
106 80bb2140 Kostas Papadimitriou
          _.each(this.flavors, _.bind(function(f){
107 80bb2140 Kostas Papadimitriou
              if (found) { return }
108 80bb2140 Kostas Papadimitriou
              if (f.get(choice) == value) {
109 80bb2140 Kostas Papadimitriou
                  found = true;
110 80bb2140 Kostas Papadimitriou
                  to_select = f;
111 80bb2140 Kostas Papadimitriou
              }
112 80bb2140 Kostas Papadimitriou
          }, this));
113 80bb2140 Kostas Papadimitriou
        },
114 80bb2140 Kostas Papadimitriou
115 ab3df8df Kostas Papadimitriou
        init_handlers: function() {
116 ab3df8df Kostas Papadimitriou
            this.$el.on('click', 'li.choice', _.bind(function(e) {
117 ab3df8df Kostas Papadimitriou
                var el = $(e.target).closest('li');
118 ab3df8df Kostas Papadimitriou
                var choice = el.data('type');
119 ab3df8df Kostas Papadimitriou
                var value = el.data('value');
120 ab3df8df Kostas Papadimitriou
                var to_select = this.selected_flavor;
121 ab3df8df Kostas Papadimitriou
                if (to_select) {
122 ab3df8df Kostas Papadimitriou
                    var attrs = _.clone(to_select.attributes);
123 ab3df8df Kostas Papadimitriou
                    attrs[choice] = value;
124 ab3df8df Kostas Papadimitriou
                    to_select = this.collection.get_flavor(attrs.cpu, attrs.ram, 
125 ab3df8df Kostas Papadimitriou
                                                           attrs.disk, 
126 ab3df8df Kostas Papadimitriou
                                                           attrs.disk_template);
127 ab3df8df Kostas Papadimitriou
                }
128 ab3df8df Kostas Papadimitriou
129 ab3df8df Kostas Papadimitriou
                if (!to_select) {
130 80bb2140 Kostas Papadimitriou
                  to_select = this.get_current(choice, value);
131 ab3df8df Kostas Papadimitriou
                }
132 ab3df8df Kostas Papadimitriou
                this.set_flavor(to_select);
133 ab3df8df Kostas Papadimitriou
            }, this));
134 ab3df8df Kostas Papadimitriou
        },
135 ab3df8df Kostas Papadimitriou
        
136 ab3df8df Kostas Papadimitriou
        update_quota_left: function() {
137 ab3df8df Kostas Papadimitriou
            this.each_choice(function(choice){
138 ab3df8df Kostas Papadimitriou
                var el = this[choice + '_el'].find(".available");
139 ab3df8df Kostas Papadimitriou
                el.removeClass("error");
140 ab3df8df Kostas Papadimitriou
                var quota = this.quotas.get('cyclades.'+choice);
141 ab3df8df Kostas Papadimitriou
                if (!quota) { return }
142 ab3df8df Kostas Papadimitriou
                var type = choice;
143 ab3df8df Kostas Papadimitriou
                var active = true;
144 ab3df8df Kostas Papadimitriou
                var key = 'available';
145 ab3df8df Kostas Papadimitriou
                var quotas = synnefo.storage.quotas;
146 ab3df8df Kostas Papadimitriou
                var available_dsp = quotas.get('cyclades.'+type).get_readable(key, active);
147 ab3df8df Kostas Papadimitriou
                var available = quotas.get('cyclades.'+type).get(key);
148 ab3df8df Kostas Papadimitriou
                var content = "({0} left)".format(available_dsp);
149 ab3df8df Kostas Papadimitriou
                if (available <= 0) { content = "(None left)"; el.addClass("error") }
150 ab3df8df Kostas Papadimitriou
                el.text(content);
151 ab3df8df Kostas Papadimitriou
            });
152 ab3df8df Kostas Papadimitriou
        },
153 ab3df8df Kostas Papadimitriou
154 ab3df8df Kostas Papadimitriou
        metric_for_choice: function(choice) {
155 effaa598 Dionysis Grigoropoulos
            var map = {ram:'MB', cpu:'X', disk:'GB', disk_template:''};
156 ab3df8df Kostas Papadimitriou
            return map[choice] || '';
157 ab3df8df Kostas Papadimitriou
        },
158 ab3df8df Kostas Papadimitriou
        
159 ab3df8df Kostas Papadimitriou
        set_unavailable: function() {
160 ab3df8df Kostas Papadimitriou
            this.$el.find("li.choice").removeClass("disabled");
161 ab3df8df Kostas Papadimitriou
            var quotas = this.quotas.get_available_for_vm({'active': true});
162 ab3df8df Kostas Papadimitriou
            var extra_quotas = this.extra_quotas;
163 ab3df8df Kostas Papadimitriou
            var user_excluded = storage.flavors.unavailable_values_for_quotas(
164 ab3df8df Kostas Papadimitriou
              quotas, 
165 80bb2140 Kostas Papadimitriou
              storage.flavors.active(), extra_quotas);
166 ab3df8df Kostas Papadimitriou
            _.each(user_excluded, _.bind(function(values, key) {
167 ab3df8df Kostas Papadimitriou
                _.each(values, _.bind(function(value) {
168 ab3df8df Kostas Papadimitriou
                    var choice_el = this.select_choice(key, value);
169 80bb2140 Kostas Papadimitriou
                    choice_el.addClass("disabled").removeClass("selected");
170 ab3df8df Kostas Papadimitriou
                }, this));
171 ab3df8df Kostas Papadimitriou
            }, this));
172 ab3df8df Kostas Papadimitriou
        },
173 ab3df8df Kostas Papadimitriou
174 ab3df8df Kostas Papadimitriou
        select_choice: function(key, value) {
175 ab3df8df Kostas Papadimitriou
            return this.$el.find(".choice[data-type="+key+"][data-value="+value+"]");
176 ab3df8df Kostas Papadimitriou
        },
177 ab3df8df Kostas Papadimitriou
178 ab3df8df Kostas Papadimitriou
        fill: function(flavors) {
179 ab3df8df Kostas Papadimitriou
            var flavors = flavors || this.flavors;
180 ab3df8df Kostas Papadimitriou
            var data = this.collection.get_data(flavors);
181 ab3df8df Kostas Papadimitriou
            this.each_choice(function(choice) {
182 ab3df8df Kostas Papadimitriou
                var el = this[choice + '_el'].find("ul");
183 ab3df8df Kostas Papadimitriou
                el.empty();
184 ab3df8df Kostas Papadimitriou
                var key = choice;
185 ab3df8df Kostas Papadimitriou
                if (key == 'ram') { key = 'mem'}
186 ab3df8df Kostas Papadimitriou
                var values = data[key];
187 ab3df8df Kostas Papadimitriou
                if (!values) { return }
188 ab3df8df Kostas Papadimitriou
                _.each(values, _.bind(function(value) {
189 ab3df8df Kostas Papadimitriou
                    var entry = $("<li class='choice choice-" + choice + "' " +
190 ab3df8df Kostas Papadimitriou
                                  "data-value=" + value +
191 ab3df8df Kostas Papadimitriou
                                  " data-type=" + choice + ">" +
192 ab3df8df Kostas Papadimitriou
                                  "<span class='value'></span>" +
193 ab3df8df Kostas Papadimitriou
                                  "<span class='metric'></span></li>");
194 ab3df8df Kostas Papadimitriou
                    entry.find(".value").text(value);
195 ab3df8df Kostas Papadimitriou
                    entry.find(".metric").text(this.metric_for_choice(choice));
196 ab3df8df Kostas Papadimitriou
                    el.append(entry);
197 ab3df8df Kostas Papadimitriou
                    el.attr('value', value);
198 ab3df8df Kostas Papadimitriou
                }, this));
199 ab3df8df Kostas Papadimitriou
            });
200 ab3df8df Kostas Papadimitriou
        },
201 ab3df8df Kostas Papadimitriou
202 ab3df8df Kostas Papadimitriou
        set_flavor: function(flavor) {
203 ab3df8df Kostas Papadimitriou
            this.$el.find("li").removeClass("selected");
204 ab3df8df Kostas Papadimitriou
            if (!flavor) {this.selected_flavor = undefined; return}
205 80bb2140 Kostas Papadimitriou
            var no_select = false;
206 80bb2140 Kostas Papadimitriou
            var self = this;
207 ab3df8df Kostas Papadimitriou
            this.each_choice(function(choice){
208 ab3df8df Kostas Papadimitriou
                var el = this[choice + '_el'];
209 ab3df8df Kostas Papadimitriou
                var choice = el.find('.choice-'+choice+'[data-value='+flavor.get(choice)+']');
210 ab3df8df Kostas Papadimitriou
                choice.addClass("selected");
211 ab3df8df Kostas Papadimitriou
            });
212 ab3df8df Kostas Papadimitriou
            this.selected_flavor = flavor;
213 ab3df8df Kostas Papadimitriou
            this.trigger("flavor:select", this.selected_flavor);
214 80bb2140 Kostas Papadimitriou
            return this.selected_flavor;
215 ab3df8df Kostas Papadimitriou
        },
216 ab3df8df Kostas Papadimitriou
217 ab3df8df Kostas Papadimitriou
        each_choice: function(f) {
218 ab3df8df Kostas Papadimitriou
            return _.each(this.choices, _.bind(f, this));
219 ab3df8df Kostas Papadimitriou
        }
220 ab3df8df Kostas Papadimitriou
    });
221 ab3df8df Kostas Papadimitriou
222 ab3df8df Kostas Papadimitriou
    views.VmResizeView = views.Overlay.extend({
223 ab3df8df Kostas Papadimitriou
        
224 ab3df8df Kostas Papadimitriou
        view_id: "vm_resize_view",
225 ab3df8df Kostas Papadimitriou
        content_selector: "#vm-resize-overlay-content",
226 ab3df8df Kostas Papadimitriou
        css_class: 'overlay-vm-resize overlay-info',
227 ab3df8df Kostas Papadimitriou
        overlay_id: "vm-resize-overlay",
228 ab3df8df Kostas Papadimitriou
229 ab3df8df Kostas Papadimitriou
        subtitle: "",
230 ab3df8df Kostas Papadimitriou
        title: "Resize Machine",
231 ab3df8df Kostas Papadimitriou
232 ab3df8df Kostas Papadimitriou
        initialize: function(options) {
233 ab3df8df Kostas Papadimitriou
            this.flavors_view = undefined; 
234 ab3df8df Kostas Papadimitriou
            views.VmResizeView.__super__.initialize.apply(this);
235 ab3df8df Kostas Papadimitriou
            _.bindAll(this);
236 ddb7229d Kostas Papadimitriou
            this.submit = this.$(".form-action.resize");
237 ddb7229d Kostas Papadimitriou
            this.shutdown = this.$(".form-action.shutdown");
238 ab3df8df Kostas Papadimitriou
            this.pre_init_handlers();
239 ddb7229d Kostas Papadimitriou
            this.handle_shutdown_complete = _.bind(this.handle_shutdown_complete, this);
240 ab3df8df Kostas Papadimitriou
        },
241 ab3df8df Kostas Papadimitriou
242 ab3df8df Kostas Papadimitriou
        pre_init_handlers: function() {
243 ab3df8df Kostas Papadimitriou
            this.submit.click(_.bind(function(){
244 ab3df8df Kostas Papadimitriou
                if (this.submit.hasClass("disabled")) {
245 ab3df8df Kostas Papadimitriou
                    return;
246 ab3df8df Kostas Papadimitriou
                };
247 ab3df8df Kostas Papadimitriou
                this.submit_resize(this.flavors_view.selected_flavor);
248 ab3df8df Kostas Papadimitriou
            }, this));
249 ddb7229d Kostas Papadimitriou
            this.shutdown.click(_.bind(this.handle_shutdown, this));
250 ab3df8df Kostas Papadimitriou
        },
251 ab3df8df Kostas Papadimitriou
        
252 ddb7229d Kostas Papadimitriou
        handle_shutdown: function() {
253 ddb7229d Kostas Papadimitriou
          if (this.shutdown.hasClass("in-progress") || 
254 ddb7229d Kostas Papadimitriou
              this.shutdown.hasClass("disabled")) {
255 ddb7229d Kostas Papadimitriou
            return;
256 ddb7229d Kostas Papadimitriou
          }
257 ddb7229d Kostas Papadimitriou
          
258 ddb7229d Kostas Papadimitriou
          this.shutdown.addClass("in-progress");
259 ddb7229d Kostas Papadimitriou
260 ddb7229d Kostas Papadimitriou
          this.vm.unbind("change:status", this.handle_shutdown_complete);
261 ddb7229d Kostas Papadimitriou
          this.vm.bind("change:status", this.handle_shutdown_complete);
262 ddb7229d Kostas Papadimitriou
263 ddb7229d Kostas Papadimitriou
          var self = this;
264 d05c0547 Kostas Papadimitriou
          this.vm.call("shutdown", undefined, function() {
265 d05c0547 Kostas Papadimitriou
            self.shutdown.removeClass("in-progress");
266 d05c0547 Kostas Papadimitriou
            self.update_layout();
267 d05c0547 Kostas Papadimitriou
            self.hide();
268 d05c0547 Kostas Papadimitriou
          });
269 ddb7229d Kostas Papadimitriou
        },
270 ddb7229d Kostas Papadimitriou
271 ddb7229d Kostas Papadimitriou
        handle_shutdown_complete: function(vm) {
272 80bb2140 Kostas Papadimitriou
          if (!vm.is_active()) {
273 ddb7229d Kostas Papadimitriou
            this.shutdown.removeClass("in-progress");
274 ddb7229d Kostas Papadimitriou
            this.vm.unbind("change:status", this.handle_shutdown_complete);
275 ddb7229d Kostas Papadimitriou
          }
276 ddb7229d Kostas Papadimitriou
        },
277 ddb7229d Kostas Papadimitriou
278 ab3df8df Kostas Papadimitriou
        submit_resize: function(flv) {
279 ddb7229d Kostas Papadimitriou
            if (this.submit.hasClass("in-progress")) { return }
280 ab3df8df Kostas Papadimitriou
            this.submit.addClass("in-progress");
281 ab3df8df Kostas Papadimitriou
            var complete = _.bind(function() {
282 ab3df8df Kostas Papadimitriou
              this.vm.set({'flavor': flv});
283 ab3df8df Kostas Papadimitriou
              this.vm.set({'flavorRef': flv.id});
284 ddb7229d Kostas Papadimitriou
              this.hide();
285 ab3df8df Kostas Papadimitriou
            }, this);
286 ab3df8df Kostas Papadimitriou
            this.vm.call("resize", complete, complete, {flavor:flv.id});
287 ab3df8df Kostas Papadimitriou
        },
288 80bb2140 Kostas Papadimitriou
        
289 80bb2140 Kostas Papadimitriou
        show_with_warning: function(vm) {
290 80bb2140 Kostas Papadimitriou
          this.show(vm);
291 80bb2140 Kostas Papadimitriou
          this.start_warning.show();
292 80bb2140 Kostas Papadimitriou
        },
293 ab3df8df Kostas Papadimitriou
294 ab3df8df Kostas Papadimitriou
        show: function(vm) {
295 80bb2140 Kostas Papadimitriou
            this.start_warning = this.$(".warning.start").hide();
296 80bb2140 Kostas Papadimitriou
            this.start_warning.hide();
297 ab3df8df Kostas Papadimitriou
            this.submit.removeClass("in-progress");
298 ab3df8df Kostas Papadimitriou
            this.vm = vm;
299 ab3df8df Kostas Papadimitriou
            this.vm.bind("change", this.handle_vm_change);
300 ab3df8df Kostas Papadimitriou
            if (this.flavors_view) {
301 ab3df8df Kostas Papadimitriou
                this.flavors_view.remove();
302 ab3df8df Kostas Papadimitriou
            }
303 80bb2140 Kostas Papadimitriou
            this.warning = this.$(".warning.shutdown");
304 ddb7229d Kostas Papadimitriou
            this.warning.hide();
305 ddb7229d Kostas Papadimitriou
            this.submit.show();
306 80bb2140 Kostas Papadimitriou
            this.shutdown.removeClass("in-progress");
307 ddb7229d Kostas Papadimitriou
            this.$(".flavor-options-inner-cont").append("<div>");
308 80bb2140 Kostas Papadimitriou
            var extra_quota = this.vm.get_flavor_quotas();
309 80bb2140 Kostas Papadimitriou
            if (!this.vm.is_active()) {
310 80bb2140 Kostas Papadimitriou
              extra_quota = undefined;
311 80bb2140 Kostas Papadimitriou
            }
312 ddb7229d Kostas Papadimitriou
            this.flavors_view = new snf.views.FlavorOptionsView({
313 ddb7229d Kostas Papadimitriou
                flavors:this.vm.get_resize_flavors(),
314 ddb7229d Kostas Papadimitriou
                el: this.$(".flavor-options-inner-cont div"),
315 ddb7229d Kostas Papadimitriou
                hidden_choices:['disk', 'disk_template'],
316 ddb7229d Kostas Papadimitriou
                selected_flavor: this.vm.get_flavor(),
317 80bb2140 Kostas Papadimitriou
                extra_quotas: extra_quota
318 ddb7229d Kostas Papadimitriou
            });
319 7c56ca01 Kostas Papadimitriou
            this.selected_flavor = this.vm.get_flavor();
320 9562bff7 Kostas Papadimitriou
            this.handle_flavor_select(this.selected_flavor);
321 ddb7229d Kostas Papadimitriou
            this.flavors_view.bind("flavor:select", this.handle_flavor_select)
322 ddb7229d Kostas Papadimitriou
            this.submit.addClass("disabled");
323 ab3df8df Kostas Papadimitriou
            views.VmResizeView.__super__.show.apply(this);
324 ab3df8df Kostas Papadimitriou
        },
325 ab3df8df Kostas Papadimitriou
326 ab3df8df Kostas Papadimitriou
        handle_flavor_select: function(flv) {
327 80bb2140 Kostas Papadimitriou
            this.selected_flavor = flv;
328 80bb2140 Kostas Papadimitriou
            if (!flv || (flv.id == this.vm.get_flavor().id)) {
329 ab3df8df Kostas Papadimitriou
                this.submit.addClass("disabled");
330 00d6e62e Kostas Papadimitriou
                if (!this.shutdown.hasClass("in-progress")) {
331 00d6e62e Kostas Papadimitriou
                  this.shutdown.addClass("disabled");
332 00d6e62e Kostas Papadimitriou
                }
333 ab3df8df Kostas Papadimitriou
            } else {
334 ddb7229d Kostas Papadimitriou
                if (this.vm.can_resize()) {
335 ddb7229d Kostas Papadimitriou
                  this.submit.removeClass("disabled");
336 ddb7229d Kostas Papadimitriou
                } else {
337 ddb7229d Kostas Papadimitriou
                  this.shutdown.removeClass("disabled hidden");
338 ddb7229d Kostas Papadimitriou
                  this.warning.show();
339 ddb7229d Kostas Papadimitriou
                }
340 ab3df8df Kostas Papadimitriou
            }
341 80bb2140 Kostas Papadimitriou
            if (flv && !this.vm.can_start(flv, true)) {
342 80bb2140 Kostas Papadimitriou
              if (!this.vm.is_active()) {
343 80bb2140 Kostas Papadimitriou
                this.start_warning.show();
344 80bb2140 Kostas Papadimitriou
              }
345 80bb2140 Kostas Papadimitriou
            } else {
346 80bb2140 Kostas Papadimitriou
              this.start_warning.hide();
347 80bb2140 Kostas Papadimitriou
            }
348 ddb7229d Kostas Papadimitriou
            this.update_vm_status();
349 ddb7229d Kostas Papadimitriou
        },
350 ddb7229d Kostas Papadimitriou
351 ddb7229d Kostas Papadimitriou
        update_vm_status: function() {
352 80bb2140 Kostas Papadimitriou
          if (this.vm.get("status") == "STOPPED") {
353 80bb2140 Kostas Papadimitriou
            this.warning.hide();
354 ddb7229d Kostas Papadimitriou
          }
355 ddb7229d Kostas Papadimitriou
          if (this.vm.get("status") == "SHUTDOWN") {
356 ddb7229d Kostas Papadimitriou
            this.shutdown.addClass("in-progress").removeClass("disabled");
357 ddb7229d Kostas Papadimitriou
            this.warning.hide();
358 ddb7229d Kostas Papadimitriou
          }
359 ab3df8df Kostas Papadimitriou
        },
360 ab3df8df Kostas Papadimitriou
361 ab3df8df Kostas Papadimitriou
        beforeOpen: function() {
362 ab3df8df Kostas Papadimitriou
            this.update_layout();
363 ab3df8df Kostas Papadimitriou
            this.init_handlers();
364 ab3df8df Kostas Papadimitriou
        },
365 ab3df8df Kostas Papadimitriou
366 ab3df8df Kostas Papadimitriou
        update_layout: function() {
367 ddb7229d Kostas Papadimitriou
            this.update_actions();
368 ab3df8df Kostas Papadimitriou
            this.update_vm_details();
369 ab3df8df Kostas Papadimitriou
            this.render_choices();
370 ddb7229d Kostas Papadimitriou
            this.update_vm_status();
371 ddb7229d Kostas Papadimitriou
        },
372 ddb7229d Kostas Papadimitriou
373 ddb7229d Kostas Papadimitriou
        update_actions: function() {
374 ddb7229d Kostas Papadimitriou
          if (!this.vm.can_resize()) {
375 ddb7229d Kostas Papadimitriou
            this.shutdown.show();
376 ddb7229d Kostas Papadimitriou
            this.warning.show();
377 ddb7229d Kostas Papadimitriou
            this.shutdown.removeClass("disabled");
378 ddb7229d Kostas Papadimitriou
            if (this.selected_flavor) {
379 ddb7229d Kostas Papadimitriou
              this.handle_flavor_select(this.selected_flavor);
380 ddb7229d Kostas Papadimitriou
            } else {
381 00d6e62e Kostas Papadimitriou
              if (!this.shutdown.hasClass("in-progress")) {
382 00d6e62e Kostas Papadimitriou
                this.shutdown.addClass("disabled");
383 00d6e62e Kostas Papadimitriou
              }
384 ddb7229d Kostas Papadimitriou
            }
385 ddb7229d Kostas Papadimitriou
            this.submit.addClass("disabled");
386 ddb7229d Kostas Papadimitriou
          } else {
387 9562bff7 Kostas Papadimitriou
            if (this.selected_flavor && this.selected_flavor.id != this.vm.get_flavor().id) {
388 80bb2140 Kostas Papadimitriou
              this.submit.removeClass("disabled");
389 80bb2140 Kostas Papadimitriou
            }
390 ddb7229d Kostas Papadimitriou
            this.shutdown.hide();
391 ddb7229d Kostas Papadimitriou
          }
392 ab3df8df Kostas Papadimitriou
        },
393 ab3df8df Kostas Papadimitriou
          
394 ab3df8df Kostas Papadimitriou
        render_choices: function() {
395 ab3df8df Kostas Papadimitriou
        },
396 ab3df8df Kostas Papadimitriou
397 ab3df8df Kostas Papadimitriou
        update_vm_details: function() {
398 deeeb954 Kostas Papadimitriou
            var name = _.escape(util.truncate(this.vm.get("name"), 70));
399 ddb7229d Kostas Papadimitriou
            this.set_subtitle(name + snf.ui.helpers.vm_icon_tag(this.vm, "small"));
400 ab3df8df Kostas Papadimitriou
        },
401 ab3df8df Kostas Papadimitriou
402 ab3df8df Kostas Papadimitriou
        handle_vm_change: function() {
403 ab3df8df Kostas Papadimitriou
          this.update_layout();
404 ab3df8df Kostas Papadimitriou
        },
405 ab3df8df Kostas Papadimitriou
406 ab3df8df Kostas Papadimitriou
        init_handlers: function() {
407 ab3df8df Kostas Papadimitriou
        },
408 ab3df8df Kostas Papadimitriou
409 ab3df8df Kostas Papadimitriou
        onClose: function() {
410 ab3df8df Kostas Papadimitriou
            this.editing = false;
411 ab3df8df Kostas Papadimitriou
            this.vm.unbind("change", this.handle_vm_change);
412 ddb7229d Kostas Papadimitriou
            this.vm.unbind("change:status", this.handle_shutdown_complete);
413 ab3df8df Kostas Papadimitriou
            this.vm = undefined;
414 ab3df8df Kostas Papadimitriou
        }
415 ab3df8df Kostas Papadimitriou
    });
416 ab3df8df Kostas Papadimitriou
    
417 ab3df8df Kostas Papadimitriou
})(this);