Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / ui / static / snf / js / ui / web / ui_networks_view.js @ 643fe7e3

History | View | Annotate | Download (38 kB)

1 664f05f0 Kostas Papadimitriou
// Copyright 2013 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 || {};
46 8d08f18a Kostas Papadimitriou
    var views = snf.views = snf.views || {}
47 8d08f18a Kostas Papadimitriou
48 8d08f18a Kostas Papadimitriou
    // shortcuts
49 8d08f18a Kostas Papadimitriou
    var bb = root.Backbone;
50 8d08f18a Kostas Papadimitriou
    
51 8d08f18a Kostas Papadimitriou
    // logging
52 8d08f18a Kostas Papadimitriou
    var logger = new snf.logging.logger("SNF-VIEWS");
53 8d08f18a Kostas Papadimitriou
    var debug = _.bind(logger.debug, logger);
54 8d08f18a Kostas Papadimitriou
    
55 8d08f18a Kostas Papadimitriou
    views.NetworkCreateView = views.Overlay.extend({
56 8d08f18a Kostas Papadimitriou
        view_id: "network_create_view",
57 8d08f18a Kostas Papadimitriou
        content_selector: "#networks-create-content",
58 8d08f18a Kostas Papadimitriou
        css_class: 'overlay-networks-create overlay-info',
59 8d08f18a Kostas Papadimitriou
        overlay_id: "network-create-overlay",
60 8d08f18a Kostas Papadimitriou
61 8d08f18a Kostas Papadimitriou
        title: "Create new private network",
62 8d08f18a Kostas Papadimitriou
        subtitle: "Networks",
63 8d08f18a Kostas Papadimitriou
64 8d08f18a Kostas Papadimitriou
        initialize: function(options) {
65 8d08f18a Kostas Papadimitriou
            views.NetworkCreateView.__super__.initialize.apply(this);
66 8d08f18a Kostas Papadimitriou
67 8d08f18a Kostas Papadimitriou
            this.create_button = this.$("form .form-action.create");
68 8d08f18a Kostas Papadimitriou
            this.text = this.$(".network-create-name");
69 8d08f18a Kostas Papadimitriou
            this.form = this.$("form");
70 126a01f2 Kostas Papadimitriou
71 126a01f2 Kostas Papadimitriou
            this.dhcp_select = this.$("#network-create-dhcp");
72 126a01f2 Kostas Papadimitriou
            this.type_select = this.$("#network-create-type");
73 126a01f2 Kostas Papadimitriou
            this.subnet_select = this.$("#network-create-subnet");
74 126a01f2 Kostas Papadimitriou
            this.subnet_custom = this.$("#network-create-subnet-custom");
75 126a01f2 Kostas Papadimitriou
                
76 126a01f2 Kostas Papadimitriou
            this.dhcp_form = this.$("#network-create-dhcp-fields");
77 126a01f2 Kostas Papadimitriou
            
78 126a01f2 Kostas Papadimitriou
            this.subnet_select.find(".subnet").remove();
79 126a01f2 Kostas Papadimitriou
            _.each(synnefo.config.network_suggested_subnets, function(subnet){
80 5d213e95 Kostas Papadimitriou
                this.subnet_select.append($('<option value='+subnet+
81 5d213e95 Kostas Papadimitriou
                                            ' class="subnet">'+subnet+
82 5d213e95 Kostas Papadimitriou
                                            '</option>'));
83 126a01f2 Kostas Papadimitriou
            }, this);
84 126a01f2 Kostas Papadimitriou
85 126a01f2 Kostas Papadimitriou
            this.type_select.find(".subnet").remove();
86 126a01f2 Kostas Papadimitriou
            _.each(synnefo.config.network_available_types, function(name, value){
87 5d213e95 Kostas Papadimitriou
                this.type_select.append($('<option value='+value+
88 5d213e95 Kostas Papadimitriou
                                          ' class="subnet">'+name+
89 5d213e95 Kostas Papadimitriou
                                          '</option>'));
90 126a01f2 Kostas Papadimitriou
            }, this);
91 126a01f2 Kostas Papadimitriou
            
92 126a01f2 Kostas Papadimitriou
            if (_.keys(synnefo.config.network_available_types).length <= 1) {
93 126a01f2 Kostas Papadimitriou
                this.type_select.closest(".form-field").hide();
94 126a01f2 Kostas Papadimitriou
            }
95 126a01f2 Kostas Papadimitriou
96 126a01f2 Kostas Papadimitriou
            this.check_dhcp_form();
97 8d08f18a Kostas Papadimitriou
            this.init_handlers();
98 8d08f18a Kostas Papadimitriou
        },
99 8d08f18a Kostas Papadimitriou
100 02ff6391 Kostas Papadimitriou
        reset_dhcp_form: function() {
101 02ff6391 Kostas Papadimitriou
          this.subnet_select.find("option")[0].selected = 1;
102 02ff6391 Kostas Papadimitriou
          this.subnet_custom.val("");
103 02ff6391 Kostas Papadimitriou
        },
104 02ff6391 Kostas Papadimitriou
105 126a01f2 Kostas Papadimitriou
        check_dhcp_form: function() {
106 126a01f2 Kostas Papadimitriou
            if (this.dhcp_select.is(":checked")) {
107 126a01f2 Kostas Papadimitriou
                this.dhcp_form.show();
108 126a01f2 Kostas Papadimitriou
            } else {
109 126a01f2 Kostas Papadimitriou
                this.dhcp_form.hide();
110 126a01f2 Kostas Papadimitriou
            }
111 126a01f2 Kostas Papadimitriou
            
112 126a01f2 Kostas Papadimitriou
            if (this.subnet_select.val() == "custom") {
113 126a01f2 Kostas Papadimitriou
                this.subnet_custom.show();
114 126a01f2 Kostas Papadimitriou
            } else {
115 126a01f2 Kostas Papadimitriou
                this.subnet_custom.hide();
116 126a01f2 Kostas Papadimitriou
            }
117 126a01f2 Kostas Papadimitriou
        },
118 126a01f2 Kostas Papadimitriou
119 8d08f18a Kostas Papadimitriou
        init_handlers: function() {
120 126a01f2 Kostas Papadimitriou
121 126a01f2 Kostas Papadimitriou
            this.dhcp_select.click(_.bind(function(e){
122 126a01f2 Kostas Papadimitriou
                this.check_dhcp_form();
123 02ff6391 Kostas Papadimitriou
                this.reset_dhcp_form();
124 126a01f2 Kostas Papadimitriou
            }, this));
125 126a01f2 Kostas Papadimitriou
126 126a01f2 Kostas Papadimitriou
            this.subnet_select.change(_.bind(function(e){
127 126a01f2 Kostas Papadimitriou
                this.check_dhcp_form();
128 126a01f2 Kostas Papadimitriou
                if (this.subnet_custom.is(":visible")) {
129 126a01f2 Kostas Papadimitriou
                    this.subnet_custom.focus();
130 126a01f2 Kostas Papadimitriou
                }
131 126a01f2 Kostas Papadimitriou
            }, this));
132 126a01f2 Kostas Papadimitriou
133 8d08f18a Kostas Papadimitriou
            this.create_button.click(_.bind(function(e){
134 8d08f18a Kostas Papadimitriou
                this.submit();
135 8d08f18a Kostas Papadimitriou
            }, this));
136 8d08f18a Kostas Papadimitriou
137 8d08f18a Kostas Papadimitriou
            this.form.submit(_.bind(function(e){
138 8d08f18a Kostas Papadimitriou
                e.preventDefault();
139 8d08f18a Kostas Papadimitriou
                this.submit;
140 8d08f18a Kostas Papadimitriou
                return false;
141 8d08f18a Kostas Papadimitriou
            }, this))
142 8d08f18a Kostas Papadimitriou
143 8d08f18a Kostas Papadimitriou
            this.text.keypress(_.bind(function(e){
144 8d08f18a Kostas Papadimitriou
                if (e.which == 13) {this.submit()};
145 8d08f18a Kostas Papadimitriou
            },this))
146 8d08f18a Kostas Papadimitriou
        },
147 8d08f18a Kostas Papadimitriou
148 8d08f18a Kostas Papadimitriou
        submit: function() {
149 8d08f18a Kostas Papadimitriou
            if (this.validate()) {
150 8d08f18a Kostas Papadimitriou
                this.create();
151 8d08f18a Kostas Papadimitriou
            };
152 8d08f18a Kostas Papadimitriou
        },
153 8d08f18a Kostas Papadimitriou
        
154 8d08f18a Kostas Papadimitriou
        validate: function() {
155 8d08f18a Kostas Papadimitriou
            // sanitazie
156 8d08f18a Kostas Papadimitriou
            var t = this.text.val();
157 8d08f18a Kostas Papadimitriou
            t = t.replace(/^\s+|\s+$/g,"");
158 8d08f18a Kostas Papadimitriou
            this.text.val(t);
159 8d08f18a Kostas Papadimitriou
160 8d08f18a Kostas Papadimitriou
            if (this.text.val() == "") {
161 8d08f18a Kostas Papadimitriou
                this.text.closest(".form-field").addClass("error");
162 8d08f18a Kostas Papadimitriou
                this.text.focus();
163 8d08f18a Kostas Papadimitriou
                return false;
164 8d08f18a Kostas Papadimitriou
            } else {
165 126a01f2 Kostas Papadimitriou
                this.text.closest(".form-field").removeClass("error");
166 8d08f18a Kostas Papadimitriou
            }
167 126a01f2 Kostas Papadimitriou
            
168 126a01f2 Kostas Papadimitriou
            if (this.dhcp_select.is(":checked")) {
169 126a01f2 Kostas Papadimitriou
                if (this.subnet_select.val() == "custom") {
170 126a01f2 Kostas Papadimitriou
                    var sub = this.subnet_custom.val();
171 126a01f2 Kostas Papadimitriou
                    sub = sub.replace(/^\s+|\s+$/g,"");
172 126a01f2 Kostas Papadimitriou
                    this.subnet_custom.val(sub);
173 126a01f2 Kostas Papadimitriou
                        
174 126a01f2 Kostas Papadimitriou
                    if (!synnefo.util.IP_REGEX.exec(this.subnet_custom.val())) {
175 126a01f2 Kostas Papadimitriou
                        this.subnet_custom.closest(".form-field").prev().addClass("error");
176 126a01f2 Kostas Papadimitriou
                        return false;
177 126a01f2 Kostas Papadimitriou
                    } else {
178 126a01f2 Kostas Papadimitriou
                        this.subnet_custom.closest(".form-field").prev().removeClass("error");
179 126a01f2 Kostas Papadimitriou
                    }
180 126a01f2 Kostas Papadimitriou
                };
181 126a01f2 Kostas Papadimitriou
            }
182 126a01f2 Kostas Papadimitriou
183 126a01f2 Kostas Papadimitriou
            return true;
184 8d08f18a Kostas Papadimitriou
        },
185 29cf98c9 Kostas Papadimitriou
        
186 29cf98c9 Kostas Papadimitriou
        get_next_available_subnet: function() {
187 29cf98c9 Kostas Papadimitriou
            var auto_tpl = synnefo.config.automatic_network_range_format;
188 29cf98c9 Kostas Papadimitriou
            if (!auto_tpl) {
189 29cf98c9 Kostas Papadimitriou
                return null
190 29cf98c9 Kostas Papadimitriou
            }
191 29cf98c9 Kostas Papadimitriou
            var index = 0;
192 29cf98c9 Kostas Papadimitriou
            var subnet = auto_tpl.format(index);
193 29cf98c9 Kostas Papadimitriou
            var networks = synnefo.storage.networks;
194 29cf98c9 Kostas Papadimitriou
            var check_existing = function(n) { return n.get('cidr') == subnet }
195 29cf98c9 Kostas Papadimitriou
            while (networks.filter(check_existing).length > 0 && index <= 255) {
196 29cf98c9 Kostas Papadimitriou
                index++;
197 29cf98c9 Kostas Papadimitriou
                subnet = auto_tpl.format(index); 
198 29cf98c9 Kostas Papadimitriou
            }
199 29cf98c9 Kostas Papadimitriou
            return subnet;
200 29cf98c9 Kostas Papadimitriou
        },
201 8d08f18a Kostas Papadimitriou
202 8d08f18a Kostas Papadimitriou
        create: function() {
203 8d08f18a Kostas Papadimitriou
            this.create_button.addClass("in-progress");
204 126a01f2 Kostas Papadimitriou
205 126a01f2 Kostas Papadimitriou
            var name = this.text.val();
206 126a01f2 Kostas Papadimitriou
            var dhcp = this.dhcp_select.is(":checked");
207 126a01f2 Kostas Papadimitriou
            var subnet = null;
208 126a01f2 Kostas Papadimitriou
            var type = this.type_select.val();
209 126a01f2 Kostas Papadimitriou
210 126a01f2 Kostas Papadimitriou
            if (dhcp) {
211 126a01f2 Kostas Papadimitriou
                if (this.subnet_select.val() == "custom") {
212 126a01f2 Kostas Papadimitriou
                    subnet = this.subnet_custom.val();
213 126a01f2 Kostas Papadimitriou
                } else if (this.subnet_select.val() == "auto") {
214 29cf98c9 Kostas Papadimitriou
                    subnet = this.get_next_available_subnet()
215 126a01f2 Kostas Papadimitriou
                } else {
216 126a01f2 Kostas Papadimitriou
                    subnet = this.subnet_select.val();
217 126a01f2 Kostas Papadimitriou
                }
218 126a01f2 Kostas Papadimitriou
                
219 126a01f2 Kostas Papadimitriou
            }
220 126a01f2 Kostas Papadimitriou
221 126a01f2 Kostas Papadimitriou
            snf.storage.networks.create(name, type, subnet, dhcp, _.bind(function(){
222 8d08f18a Kostas Papadimitriou
                this.hide();
223 8e13afa9 Kostas Papadimitriou
                // trigger parent view create handler
224 8e13afa9 Kostas Papadimitriou
                this.parent_view.post_create();
225 8d08f18a Kostas Papadimitriou
            }, this));
226 8d08f18a Kostas Papadimitriou
        },
227 8d08f18a Kostas Papadimitriou
228 8d08f18a Kostas Papadimitriou
        beforeOpen: function() {
229 8d08f18a Kostas Papadimitriou
            this.create_button.removeClass("in-progress")
230 95072bf0 Kostas Papadimitriou
            this.text.closest(".form-field").removeClass("error");
231 8d08f18a Kostas Papadimitriou
            this.text.val("");
232 8d08f18a Kostas Papadimitriou
            this.text.show();
233 8d08f18a Kostas Papadimitriou
            this.text.focus();
234 126a01f2 Kostas Papadimitriou
            this.subnet_custom.val("");
235 126a01f2 Kostas Papadimitriou
            this.subnet_select.val("auto");
236 126a01f2 Kostas Papadimitriou
            this.dhcp_select.attr("checked", true);
237 126a01f2 Kostas Papadimitriou
            this.type_select.val(_.keys(synnefo.config.network_available_types)[0]);
238 126a01f2 Kostas Papadimitriou
            this.check_dhcp_form();
239 8d08f18a Kostas Papadimitriou
        },
240 8d08f18a Kostas Papadimitriou
241 8d08f18a Kostas Papadimitriou
        onOpen: function() {
242 8d08f18a Kostas Papadimitriou
            this.text.focus();
243 8d08f18a Kostas Papadimitriou
        }
244 8d08f18a Kostas Papadimitriou
    });
245 8d08f18a Kostas Papadimitriou
246 664f05f0 Kostas Papadimitriou
    views.NetworkPortView = views.ext.ModelView.extend({
247 664f05f0 Kostas Papadimitriou
      tpl: '#network-port-view-tpl',
248 664f05f0 Kostas Papadimitriou
      
249 6368ca5d Kostas Papadimitriou
      error_status: function(status) {
250 6368ca5d Kostas Papadimitriou
        return status == "ERROR"
251 6368ca5d Kostas Papadimitriou
      },
252 6368ca5d Kostas Papadimitriou
253 664f05f0 Kostas Papadimitriou
      vm_logo_url: function(vm) {
254 664f05f0 Kostas Papadimitriou
        if (!this.model.get('vm')) { return '' }
255 664f05f0 Kostas Papadimitriou
        return synnefo.ui.helpers.vm_icon_path(this.model.get('vm'), 'medium');
256 664f05f0 Kostas Papadimitriou
      },
257 0c66520a Kostas Papadimitriou
258 0c66520a Kostas Papadimitriou
      vm_status_cls: function(vm) {
259 0c66520a Kostas Papadimitriou
        var cls = 'inner clearfix main-content';
260 0c66520a Kostas Papadimitriou
        if (!this.model.get('vm')) { return cls }
261 0c66520a Kostas Papadimitriou
        if (this.model.get('vm').in_error_state()) {
262 0c66520a Kostas Papadimitriou
          cls += ' vm-status-error';
263 0c66520a Kostas Papadimitriou
        }
264 0c66520a Kostas Papadimitriou
        return cls
265 0c66520a Kostas Papadimitriou
      },
266 664f05f0 Kostas Papadimitriou
      
267 3c446f85 Kostas Papadimitriou
      set_confirm: function(action) {
268 664f05f0 Kostas Papadimitriou
        var parent = this.parent_view.parent_view.el;
269 664f05f0 Kostas Papadimitriou
        parent.addClass("subactionpending");
270 664f05f0 Kostas Papadimitriou
      },
271 664f05f0 Kostas Papadimitriou
272 3c446f85 Kostas Papadimitriou
      unset_confirm: function(action) {
273 664f05f0 Kostas Papadimitriou
        var parent = this.parent_view.parent_view.el;
274 664f05f0 Kostas Papadimitriou
        parent.removeClass("subactionpending");
275 664f05f0 Kostas Papadimitriou
      },
276 664f05f0 Kostas Papadimitriou
277 664f05f0 Kostas Papadimitriou
      post_init_element: function() {
278 664f05f0 Kostas Papadimitriou
        this.in_progress = false;
279 664f05f0 Kostas Papadimitriou
        this.firewall = this.$(".firewall-content").hide();
280 664f05f0 Kostas Papadimitriou
        this.firewall_toggler = this.$(".firewall-toggle");
281 664f05f0 Kostas Papadimitriou
        this.firewall_apply = this.$(".firewall-apply");
282 664f05f0 Kostas Papadimitriou
        this.firewall_legends = this.firewall.find(".checkbox-legends");
283 664f05f0 Kostas Papadimitriou
        this.firewall_inputs = this.firewall.find("input");
284 664f05f0 Kostas Papadimitriou
        this.firewall_apply = this.firewall.find("button");
285 664f05f0 Kostas Papadimitriou
        this.firewall_visible = false;
286 664f05f0 Kostas Papadimitriou
287 664f05f0 Kostas Papadimitriou
        this.firewall_toggler.click(_.bind(function() {
288 664f05f0 Kostas Papadimitriou
          this.toggle_firewall();
289 664f05f0 Kostas Papadimitriou
        }, this));
290 664f05f0 Kostas Papadimitriou
291 664f05f0 Kostas Papadimitriou
        this.firewall.find(".checkbox-legends, input").click(
292 664f05f0 Kostas Papadimitriou
          _.bind(this.handle_firewall_choice_click, this));
293 664f05f0 Kostas Papadimitriou
        this.update_firewall();
294 664f05f0 Kostas Papadimitriou
      },
295 664f05f0 Kostas Papadimitriou
      
296 664f05f0 Kostas Papadimitriou
      toggle_firewall: function(e, hide, cb) {
297 664f05f0 Kostas Papadimitriou
          hide = hide === undefined ? false : hide;
298 664f05f0 Kostas Papadimitriou
          if (hide) {
299 664f05f0 Kostas Papadimitriou
            this.firewall.stop().hide();
300 664f05f0 Kostas Papadimitriou
          } else {
301 375a9cb5 Kostas Papadimitriou
            this.firewall.slideToggle(function() {
302 375a9cb5 Kostas Papadimitriou
              cb && cb();
303 375a9cb5 Kostas Papadimitriou
              $(window).trigger("resize");
304 375a9cb5 Kostas Papadimitriou
            });
305 664f05f0 Kostas Papadimitriou
          }
306 664f05f0 Kostas Papadimitriou
          this.firewall_toggler.toggleClass("open");
307 664f05f0 Kostas Papadimitriou
          this.firewall_visible = this.firewall_toggler.hasClass("open");
308 664f05f0 Kostas Papadimitriou
          if (!this.firewall_visible) {
309 664f05f0 Kostas Papadimitriou
            this.firewall_apply.fadeOut(50);
310 bfb11987 Kostas Papadimitriou
          } else {
311 bfb11987 Kostas Papadimitriou
            this.model.actions.reset_pending();
312 664f05f0 Kostas Papadimitriou
          }
313 664f05f0 Kostas Papadimitriou
          this.update_firewall();
314 664f05f0 Kostas Papadimitriou
      },
315 664f05f0 Kostas Papadimitriou
    
316 664f05f0 Kostas Papadimitriou
      post_hide: function() {
317 664f05f0 Kostas Papadimitriou
        views.NetworkPortView.__super__.post_hide.apply(this);
318 664f05f0 Kostas Papadimitriou
        if (this.firewall_visible) {
319 664f05f0 Kostas Papadimitriou
          this.toggle_firewall({}, true);
320 664f05f0 Kostas Papadimitriou
        }
321 664f05f0 Kostas Papadimitriou
      },
322 664f05f0 Kostas Papadimitriou
323 664f05f0 Kostas Papadimitriou
      handle_firewall_choice_click: function(e) {
324 664f05f0 Kostas Papadimitriou
          var el = $(e.currentTarget);
325 664f05f0 Kostas Papadimitriou
          if (el.get(0).tagName == "INPUT") {
326 664f05f0 Kostas Papadimitriou
            el = el.next();
327 664f05f0 Kostas Papadimitriou
          }
328 664f05f0 Kostas Papadimitriou
          var current = this.model.get("firewall_status");
329 664f05f0 Kostas Papadimitriou
          var selected = el.prev().val();
330 664f05f0 Kostas Papadimitriou
331 664f05f0 Kostas Papadimitriou
          el.parent().find("input").attr("checked", false);
332 664f05f0 Kostas Papadimitriou
          el.prev().attr("checked", true);
333 664f05f0 Kostas Papadimitriou
334 664f05f0 Kostas Papadimitriou
          if (selected != current) {
335 664f05f0 Kostas Papadimitriou
            this.firewall_apply.show();
336 664f05f0 Kostas Papadimitriou
          } else {
337 664f05f0 Kostas Papadimitriou
            this.firewall_apply.hide();
338 664f05f0 Kostas Papadimitriou
          }
339 664f05f0 Kostas Papadimitriou
      },
340 664f05f0 Kostas Papadimitriou
      
341 664f05f0 Kostas Papadimitriou
      disconnect_port: function(model, e) {
342 c700cb69 Kostas Papadimitriou
        var parent = this.parent_view.parent_view.el;
343 c700cb69 Kostas Papadimitriou
        parent.removeClass("subactionpending");
344 664f05f0 Kostas Papadimitriou
        e && e.stopPropagation();
345 5e66fc73 Kostas Papadimitriou
        var network = this.model.get("network");
346 664f05f0 Kostas Papadimitriou
        this.model.actions.reset_pending();
347 664f05f0 Kostas Papadimitriou
        this.model.disconnect(_.bind(this.disconnect_port_complete, this));
348 664f05f0 Kostas Papadimitriou
      },
349 664f05f0 Kostas Papadimitriou
350 664f05f0 Kostas Papadimitriou
      disconnect_port_complete: function() {
351 664f05f0 Kostas Papadimitriou
      },
352 664f05f0 Kostas Papadimitriou
353 664f05f0 Kostas Papadimitriou
      set_firewall: function() {
354 c700cb69 Kostas Papadimitriou
        var parent = this.parent_view.parent_view.el;
355 c700cb69 Kostas Papadimitriou
        parent.removeClass("subactionpending");
356 664f05f0 Kostas Papadimitriou
        var value = this.get_selected_value();
357 664f05f0 Kostas Papadimitriou
        this.firewall_apply.addClass("in-progress");
358 e4330db2 Kostas Papadimitriou
        var vm = this.model.get('vm');
359 e4330db2 Kostas Papadimitriou
        if (!vm) { return }
360 664f05f0 Kostas Papadimitriou
        this.model.set({'pending_firewall': value});
361 e4330db2 Kostas Papadimitriou
        vm.set_firewall(this.model, value, this.set_firewall_success,
362 e4330db2 Kostas Papadimitriou
                        this.set_firewall_error)
363 664f05f0 Kostas Papadimitriou
        this.in_progress = true;
364 664f05f0 Kostas Papadimitriou
      },
365 664f05f0 Kostas Papadimitriou
      
366 e4330db2 Kostas Papadimitriou
      set_firewall_success: function() {
367 e4330db2 Kostas Papadimitriou
        this.set_firewall_complete();
368 e4330db2 Kostas Papadimitriou
      },
369 e4330db2 Kostas Papadimitriou
370 e4330db2 Kostas Papadimitriou
      set_firewall_error: function() {
371 e4330db2 Kostas Papadimitriou
        this.model.set({'pending_firewall': undefined});
372 e4330db2 Kostas Papadimitriou
        this.set_firewall_complete();
373 e4330db2 Kostas Papadimitriou
      },
374 e4330db2 Kostas Papadimitriou
375 664f05f0 Kostas Papadimitriou
      set_firewall_complete: function() {
376 664f05f0 Kostas Papadimitriou
        this.in_progress = false;
377 664f05f0 Kostas Papadimitriou
        this.toggle_firewall({}, false, _.bind(function() {
378 664f05f0 Kostas Papadimitriou
          this.firewall_apply.removeClass("in-progress").show();
379 664f05f0 Kostas Papadimitriou
        }, this));
380 664f05f0 Kostas Papadimitriou
      },
381 664f05f0 Kostas Papadimitriou
382 664f05f0 Kostas Papadimitriou
      get_selected_value: function() {
383 664f05f0 Kostas Papadimitriou
        return this.firewall_inputs.filter(":checked").val();
384 664f05f0 Kostas Papadimitriou
      },
385 664f05f0 Kostas Papadimitriou
386 664f05f0 Kostas Papadimitriou
      update_firewall: function() {
387 664f05f0 Kostas Papadimitriou
        var value = this.model.get("firewall_status");
388 664f05f0 Kostas Papadimitriou
        var value_selector = "[value=" + value + "]"
389 664f05f0 Kostas Papadimitriou
        var status_span = this.firewall_toggler.find("span span");
390 664f05f0 Kostas Papadimitriou
        var current_choice = this.firewall_inputs.filter(value_selector);
391 664f05f0 Kostas Papadimitriou
392 664f05f0 Kostas Papadimitriou
        if (_.contains(["PROTECTED", "ENABLED"], value)) {
393 664f05f0 Kostas Papadimitriou
          status_span.removeClass("firewall-off").addClass("firewall-on");
394 664f05f0 Kostas Papadimitriou
          status_span.text("On");
395 664f05f0 Kostas Papadimitriou
        } else {
396 664f05f0 Kostas Papadimitriou
          status_span.removeClass("firewall-on").addClass("firewall-off");
397 664f05f0 Kostas Papadimitriou
          status_span.text("Off");
398 664f05f0 Kostas Papadimitriou
        }
399 664f05f0 Kostas Papadimitriou
        
400 664f05f0 Kostas Papadimitriou
        this.firewall_inputs.attr("checked", false);
401 664f05f0 Kostas Papadimitriou
        this.firewall_legends.removeClass("current");
402 664f05f0 Kostas Papadimitriou
        current_choice.attr("checked", true)
403 664f05f0 Kostas Papadimitriou
        current_choice.next().addClass("current");
404 664f05f0 Kostas Papadimitriou
      },
405 664f05f0 Kostas Papadimitriou
406 664f05f0 Kostas Papadimitriou
      show_vm_details: function() {
407 664f05f0 Kostas Papadimitriou
        var vm = this.model.get('vm');
408 664f05f0 Kostas Papadimitriou
        if (vm) { snf.ui.main.show_vm_details(vm) }
409 664f05f0 Kostas Papadimitriou
      }
410 664f05f0 Kostas Papadimitriou
    });
411 8d08f18a Kostas Papadimitriou
412 664f05f0 Kostas Papadimitriou
    views.NetworkPortCollectionView = views.ext.CollectionView.extend({
413 664f05f0 Kostas Papadimitriou
      tpl: '#network-port-collection-view-tpl',
414 664f05f0 Kostas Papadimitriou
      model_view_cls: views.NetworkPortView,
415 664f05f0 Kostas Papadimitriou
      rivets_view: true,
416 664f05f0 Kostas Papadimitriou
      get_rivet_object: function() {
417 664f05f0 Kostas Papadimitriou
        return {
418 664f05f0 Kostas Papadimitriou
          model: this.collection.network
419 664f05f0 Kostas Papadimitriou
        }
420 664f05f0 Kostas Papadimitriou
      },
421 664f05f0 Kostas Papadimitriou
      resolve_storage_object: function() {
422 664f05f0 Kostas Papadimitriou
        return this.collection
423 664f05f0 Kostas Papadimitriou
      },
424 a37c5497 Kostas Papadimitriou
425 664f05f0 Kostas Papadimitriou
      show_connect_vms_overlay: function() {
426 664f05f0 Kostas Papadimitriou
        this.parent_view.show_connect_vms_overlay();
427 62ebf1c3 Kostas Papadimitriou
      },
428 62ebf1c3 Kostas Papadimitriou
429 62ebf1c3 Kostas Papadimitriou
      check_empty: function() {
430 62ebf1c3 Kostas Papadimitriou
        views.NetworkPortCollectionView.__super__.check_empty.apply(this, arguments);
431 62ebf1c3 Kostas Papadimitriou
        if (this.collection.length == 0) {
432 62ebf1c3 Kostas Papadimitriou
          this.parent_view.set_ports_empty();
433 62ebf1c3 Kostas Papadimitriou
        } else {
434 62ebf1c3 Kostas Papadimitriou
          this.parent_view.unset_ports_empty();
435 62ebf1c3 Kostas Papadimitriou
        }
436 664f05f0 Kostas Papadimitriou
      }
437 664f05f0 Kostas Papadimitriou
    });
438 8d08f18a Kostas Papadimitriou
439 664f05f0 Kostas Papadimitriou
    views.NetworkView = views.ext.ModelView.extend({
440 664f05f0 Kostas Papadimitriou
      tpl: '#network-view-tpl',
441 664f05f0 Kostas Papadimitriou
      auto_bind: ['connect_vm'],
442 664f05f0 Kostas Papadimitriou
      post_init_element: function() {
443 664f05f0 Kostas Papadimitriou
        this.ports = this.$(".ports.nested-model-list");
444 664f05f0 Kostas Papadimitriou
        this.ports.hide();
445 664f05f0 Kostas Papadimitriou
        this.ports_toggler = this.$(".network-ports-toggler");
446 664f05f0 Kostas Papadimitriou
        this.ports_toggler.click(this.toggle_ports);
447 664f05f0 Kostas Papadimitriou
        this.ports_visible = false;
448 664f05f0 Kostas Papadimitriou
      },
449 62ebf1c3 Kostas Papadimitriou
      
450 62ebf1c3 Kostas Papadimitriou
      set_ports_empty: function() {
451 62ebf1c3 Kostas Papadimitriou
        if (this.ports_visible) {
452 62ebf1c3 Kostas Papadimitriou
          this.toggle_ports();
453 62ebf1c3 Kostas Papadimitriou
        }
454 62ebf1c3 Kostas Papadimitriou
        this.ports_empty = true;
455 62ebf1c3 Kostas Papadimitriou
        this.ports_toggler.find(".cont-toggler").addClass("disabled");
456 62ebf1c3 Kostas Papadimitriou
      },
457 62ebf1c3 Kostas Papadimitriou
458 62ebf1c3 Kostas Papadimitriou
      unset_ports_empty: function() {
459 62ebf1c3 Kostas Papadimitriou
        this.ports_toggler.find(".cont-toggler").removeClass("disabled");
460 62ebf1c3 Kostas Papadimitriou
        this.ports_empty = false;
461 62ebf1c3 Kostas Papadimitriou
      },
462 664f05f0 Kostas Papadimitriou
463 664f05f0 Kostas Papadimitriou
      toggle_ports: function(e, hide) {
464 375a9cb5 Kostas Papadimitriou
        $(window).trigger("resize");
465 664f05f0 Kostas Papadimitriou
        hide = hide === undefined ? false : hide;
466 664f05f0 Kostas Papadimitriou
        if (hide) {
467 664f05f0 Kostas Papadimitriou
          this.ports.stop().hide();
468 664f05f0 Kostas Papadimitriou
        } else {
469 62ebf1c3 Kostas Papadimitriou
          if (this.ports_empty) { return }
470 9db70e60 Kostas Papadimitriou
          var self = this;
471 9db70e60 Kostas Papadimitriou
          this.ports.parent().parent().css({overflow: 'hidden'});
472 375a9cb5 Kostas Papadimitriou
          this.ports.stop().slideToggle(function() {
473 375a9cb5 Kostas Papadimitriou
              $(window).trigger("resize");
474 9db70e60 Kostas Papadimitriou
              self.ports.parent().parent().css({overflow: 'visible'});
475 375a9cb5 Kostas Papadimitriou
            });
476 664f05f0 Kostas Papadimitriou
        }
477 664f05f0 Kostas Papadimitriou
        this.ports_toggler.find(".cont-toggler").toggleClass("open");
478 664f05f0 Kostas Papadimitriou
        this.ports_visible = this.ports_toggler.find(".cont-toggler").hasClass("open");
479 9c8f31ad Kostas Papadimitriou
        if (this.ports_visible) {
480 9c8f31ad Kostas Papadimitriou
          $(this.el).addClass("hovered");
481 9c8f31ad Kostas Papadimitriou
        } else {
482 9c8f31ad Kostas Papadimitriou
          $(this.el).removeClass("hovered");
483 9c8f31ad Kostas Papadimitriou
        }
484 664f05f0 Kostas Papadimitriou
      },
485 365af933 Kostas Papadimitriou
      
486 365af933 Kostas Papadimitriou
      get_network_icon: function() {
487 365af933 Kostas Papadimitriou
        var ico = this.model.get('is_public') ? 'internet.png' : 'network.png';
488 365af933 Kostas Papadimitriou
        return synnefo.config.media_url + 'images/' + ico;
489 365af933 Kostas Papadimitriou
      },
490 664f05f0 Kostas Papadimitriou
491 664f05f0 Kostas Papadimitriou
      post_hide: function() {
492 664f05f0 Kostas Papadimitriou
        views.NetworkView.__super__.post_hide.apply(this);
493 664f05f0 Kostas Papadimitriou
        if (this.ports_visible) {
494 664f05f0 Kostas Papadimitriou
          this.toggle_ports({}, true);
495 664f05f0 Kostas Papadimitriou
        }
496 664f05f0 Kostas Papadimitriou
      },
497 664f05f0 Kostas Papadimitriou
      
498 664f05f0 Kostas Papadimitriou
      status_map: {
499 664f05f0 Kostas Papadimitriou
        'ACTIVE': 'Active',
500 ee61780c Kostas Papadimitriou
        'SNF:DRAINED': 'Drained',
501 664f05f0 Kostas Papadimitriou
        'CONNECTING': 'Connecting',
502 664f05f0 Kostas Papadimitriou
        'DISCONNECTING': 'Disconnecting',
503 b51b21db Kostas Papadimitriou
        'REMOVING': 'Destroying'
504 664f05f0 Kostas Papadimitriou
      },
505 664f05f0 Kostas Papadimitriou
506 664f05f0 Kostas Papadimitriou
      status_cls_map: {
507 664f05f0 Kostas Papadimitriou
        'ACTIVE': 'status-active',
508 ee61780c Kostas Papadimitriou
        'SNF:DRAINED': 'status-terminated',
509 664f05f0 Kostas Papadimitriou
        'DISCONNECTING': 'status-progress',
510 664f05f0 Kostas Papadimitriou
        'CONNECTING': 'status-progress',
511 664f05f0 Kostas Papadimitriou
        'REMOVING': 'status-progress'
512 664f05f0 Kostas Papadimitriou
      },
513 664f05f0 Kostas Papadimitriou
      
514 664f05f0 Kostas Papadimitriou
      status_cls: function(status) {    
515 664f05f0 Kostas Papadimitriou
        return this.status_cls_map[this.model.get('ext_status')]
516 664f05f0 Kostas Papadimitriou
      },
517 664f05f0 Kostas Papadimitriou
518 664f05f0 Kostas Papadimitriou
      status_display: function(status) {
519 664f05f0 Kostas Papadimitriou
        var status;
520 d233867a Kostas Papadimitriou
        var cidr = this.model.get('cidr');
521 d233867a Kostas Papadimitriou
        var status = this.model.get('ext_status');
522 d233867a Kostas Papadimitriou
        if (status != 'REMOVING' && cidr) {
523 d233867a Kostas Papadimitriou
          return cidr
524 d233867a Kostas Papadimitriou
        }
525 5e66fc73 Kostas Papadimitriou
        if (this.model.id == "snf-combined-public-network" && !_.contains(
526 5e66fc73 Kostas Papadimitriou
          ["CONNECTING", "DISCONNECTING"], status)) {
527 e6a4b75c Kostas Papadimitriou
          return "Public"
528 5e66fc73 Kostas Papadimitriou
        }
529 5e66fc73 Kostas Papadimitriou
530 d233867a Kostas Papadimitriou
        return this.status_map[status];
531 664f05f0 Kostas Papadimitriou
      },
532 664f05f0 Kostas Papadimitriou
      
533 664f05f0 Kostas Papadimitriou
      connect_vms: function(vms, cb) {
534 664f05f0 Kostas Papadimitriou
        var finished = 0;
535 664f05f0 Kostas Papadimitriou
        var completed = function() {
536 664f05f0 Kostas Papadimitriou
          finished++;
537 664f05f0 Kostas Papadimitriou
          if (finished == vms.length) {
538 664f05f0 Kostas Papadimitriou
            cb();
539 664f05f0 Kostas Papadimitriou
          }
540 664f05f0 Kostas Papadimitriou
        }
541 664f05f0 Kostas Papadimitriou
        _.each(vms, function(vm) {
542 664f05f0 Kostas Papadimitriou
          this.model.connect_vm(vm, completed);
543 664f05f0 Kostas Papadimitriou
        }, this);
544 664f05f0 Kostas Papadimitriou
      },
545 664f05f0 Kostas Papadimitriou
      
546 a681ab44 Kostas Papadimitriou
      remove: function(model, e) {
547 a681ab44 Kostas Papadimitriou
        e && e.stopPropagation();
548 3c446f85 Kostas Papadimitriou
        this.model.do_remove();
549 664f05f0 Kostas Papadimitriou
      },
550 664f05f0 Kostas Papadimitriou
551 664f05f0 Kostas Papadimitriou
      show_connect_vms_overlay: function() {
552 664f05f0 Kostas Papadimitriou
        var view = new views.NetworkConnectVMsOverlay();
553 cfd0f789 Kostas Papadimitriou
        this.model.actions.reset_pending();
554 a37c5497 Kostas Papadimitriou
        vms = this.model.connectable_vms;
555 664f05f0 Kostas Papadimitriou
        var cb = _.bind(function(vms) {
556 664f05f0 Kostas Papadimitriou
          view.set_in_progress();
557 664f05f0 Kostas Papadimitriou
          var cbinner = function() {
558 664f05f0 Kostas Papadimitriou
            view.hide();
559 664f05f0 Kostas Papadimitriou
            delete view;
560 664f05f0 Kostas Papadimitriou
          }
561 664f05f0 Kostas Papadimitriou
          this.connect_vms(vms, cbinner);
562 664f05f0 Kostas Papadimitriou
        }, this);
563 8e13afa9 Kostas Papadimitriou
        view.show_vms(this.model, vms, [], cb, "subtitle", this);
564 664f05f0 Kostas Papadimitriou
      }
565 8d08f18a Kostas Papadimitriou
566 664f05f0 Kostas Papadimitriou
    });
567 664f05f0 Kostas Papadimitriou
    
568 664f05f0 Kostas Papadimitriou
    views.NetworksCollectionView = views.ext.CollectionView.extend({
569 664f05f0 Kostas Papadimitriou
      collection: storage.networks,
570 664f05f0 Kostas Papadimitriou
      collection_name: 'networks',
571 664f05f0 Kostas Papadimitriou
      model_view_cls: views.NetworkView,
572 664f05f0 Kostas Papadimitriou
      create_view_cls: views.NetworkCreateView,
573 8e13afa9 Kostas Papadimitriou
      quota_key: 'cyclades.network.private',
574 6368ca5d Kostas Papadimitriou
575 6368ca5d Kostas Papadimitriou
      group_key: 'name',
576 6368ca5d Kostas Papadimitriou
      group_network: function(n) {
577 6368ca5d Kostas Papadimitriou
        return n.get('is_public')
578 6368ca5d Kostas Papadimitriou
      },
579 664f05f0 Kostas Papadimitriou
      
580 664f05f0 Kostas Papadimitriou
      init: function() {
581 6368ca5d Kostas Papadimitriou
        this.grouped_networks = {};
582 664f05f0 Kostas Papadimitriou
        views.NetworksCollectionView.__super__.init.apply(this, arguments);
583 664f05f0 Kostas Papadimitriou
      },
584 664f05f0 Kostas Papadimitriou
      
585 664f05f0 Kostas Papadimitriou
      check_empty: function() {
586 664f05f0 Kostas Papadimitriou
        views.NetworksCollectionView.__super__.check_empty.apply(this, arguments);
587 eab078ee Kostas Papadimitriou
        if (this.collection.filter(function(n){ return !n.is_public()}).length == 0) {
588 eab078ee Kostas Papadimitriou
          this.$(".private").hide();  
589 eab078ee Kostas Papadimitriou
        } else {
590 eab078ee Kostas Papadimitriou
          this.$(".private").show();  
591 eab078ee Kostas Papadimitriou
        }
592 664f05f0 Kostas Papadimitriou
      },
593 664f05f0 Kostas Papadimitriou
594 664f05f0 Kostas Papadimitriou
      add_model: function(m) {
595 6368ca5d Kostas Papadimitriou
        var CombinedPublic = models.networks.CombinedPublicNetwork;
596 6368ca5d Kostas Papadimitriou
        if (this.group_network(m) && synnefo.config.group_public_networks) {
597 6368ca5d Kostas Papadimitriou
          var group_value = m.get(this.group_key);
598 6368ca5d Kostas Papadimitriou
          if (!(group_value in this.grouped_networks)) {
599 6368ca5d Kostas Papadimitriou
            var combined_public = new CombinedPublic({name: group_value});
600 6368ca5d Kostas Papadimitriou
            combined_public_view = new views.NetworkView({
601 6368ca5d Kostas Papadimitriou
              model: combined_public
602 6368ca5d Kostas Papadimitriou
            });
603 6368ca5d Kostas Papadimitriou
604 6368ca5d Kostas Papadimitriou
            this.add_model_view(combined_public_view, 
605 6368ca5d Kostas Papadimitriou
                                combined_public, 0);
606 6368ca5d Kostas Papadimitriou
            this.grouped_networks[group_value] = combined_public;
607 6368ca5d Kostas Papadimitriou
          }
608 664f05f0 Kostas Papadimitriou
        }
609 664f05f0 Kostas Papadimitriou
        return views.NetworksCollectionView.__super__.add_model.call(this, m);
610 664f05f0 Kostas Papadimitriou
      },
611 664f05f0 Kostas Papadimitriou
612 664f05f0 Kostas Papadimitriou
      remove_model: function(m) {
613 6368ca5d Kostas Papadimitriou
        if (m.id == 'snf-combined-public-network' ||
614 6368ca5d Kostas Papadimitriou
            (this.group_network(m) && 
615 6368ca5d Kostas Papadimitriou
            synnefo.config.group_public_networks)) {
616 6368ca5d Kostas Papadimitriou
          return false;
617 664f05f0 Kostas Papadimitriou
        } else {
618 664f05f0 Kostas Papadimitriou
          return views.NetworksCollectionView.__super__.remove_model.call(this, m);
619 664f05f0 Kostas Papadimitriou
        }
620 664f05f0 Kostas Papadimitriou
      },
621 664f05f0 Kostas Papadimitriou
622 664f05f0 Kostas Papadimitriou
      get_model_view_cls: function(m) {
623 6368ca5d Kostas Papadimitriou
        if (m.id == 'snf-combined-public-network' || 
624 6368ca5d Kostas Papadimitriou
            (this.group_network(m) && 
625 6368ca5d Kostas Papadimitriou
             synnefo.config.group_public_networks)) {
626 664f05f0 Kostas Papadimitriou
          return false;
627 664f05f0 Kostas Papadimitriou
        }
628 664f05f0 Kostas Papadimitriou
        return views.NetworksCollectionView.__super__.get_model_view_cls.apply(this, [m]);
629 664f05f0 Kostas Papadimitriou
      },
630 664f05f0 Kostas Papadimitriou
      
631 664f05f0 Kostas Papadimitriou
      parent_for_model: function(m) {
632 664f05f0 Kostas Papadimitriou
        if (m.get('is_public')) {
633 664f05f0 Kostas Papadimitriou
          return this.list_el.find(".public");
634 664f05f0 Kostas Papadimitriou
        } else {
635 664f05f0 Kostas Papadimitriou
          return this.list_el.find(".private");
636 664f05f0 Kostas Papadimitriou
        }
637 664f05f0 Kostas Papadimitriou
      }
638 664f05f0 Kostas Papadimitriou
    });
639 664f05f0 Kostas Papadimitriou
640 664f05f0 Kostas Papadimitriou
    views.NetworksPaneView = views.ext.PaneView.extend({
641 664f05f0 Kostas Papadimitriou
      id: "pane",
642 664f05f0 Kostas Papadimitriou
      el: '#networks-pane',
643 664f05f0 Kostas Papadimitriou
      collection_view_cls: views.NetworksCollectionView,
644 664f05f0 Kostas Papadimitriou
      collection_view_selector: '#networks-list-view'
645 664f05f0 Kostas Papadimitriou
    });
646 a37c5497 Kostas Papadimitriou
    
647 a37c5497 Kostas Papadimitriou
    views.VMSelectView = views.ext.SelectModelView.extend({
648 a37c5497 Kostas Papadimitriou
      tpl: '#vm-select-model-tpl',
649 a37c5497 Kostas Papadimitriou
      get_vm_icon: function() {
650 a37c5497 Kostas Papadimitriou
        return $(snf.ui.helpers.vm_icon_tag(this.model, "small")).attr("src")
651 a37c5497 Kostas Papadimitriou
      },
652 a37c5497 Kostas Papadimitriou
      status_cls: function() {
653 a37c5497 Kostas Papadimitriou
        return (views.IconView.STATE_CLASSES[this.model.get("state")] || []).join(" ") + " status clearfix"
654 a37c5497 Kostas Papadimitriou
      },
655 a37c5497 Kostas Papadimitriou
      status_display: function() {
656 a37c5497 Kostas Papadimitriou
        return STATE_TEXTS[this.model.get("state")]
657 a37c5497 Kostas Papadimitriou
      }
658 a37c5497 Kostas Papadimitriou
    });
659 a37c5497 Kostas Papadimitriou
660 a37c5497 Kostas Papadimitriou
    views.VMSelectView = views.ext.CollectionView.extend({
661 a37c5497 Kostas Papadimitriou
      init: function() {
662 a37c5497 Kostas Papadimitriou
        views.VMSelectView.__super__.init.apply(this);
663 a37c5497 Kostas Papadimitriou
      },
664 a37c5497 Kostas Papadimitriou
      tpl: '#vm-select-collection-tpl',
665 a37c5497 Kostas Papadimitriou
      model_view_cls: views.VMSelectView,
666 a37c5497 Kostas Papadimitriou
      
667 a37c5497 Kostas Papadimitriou
      trigger_select: function(view, select) {
668 a37c5497 Kostas Papadimitriou
        this.trigger("change:select", view, select);
669 a37c5497 Kostas Papadimitriou
      },
670 a37c5497 Kostas Papadimitriou
671 a37c5497 Kostas Papadimitriou
      post_add_model_view: function(view) {
672 a37c5497 Kostas Papadimitriou
        view.bind("change:select", this.trigger_select, this);
673 a37c5497 Kostas Papadimitriou
        if (!this.options.allow_multiple) {
674 a37c5497 Kostas Papadimitriou
          view.input.prop("type", "radio");
675 a37c5497 Kostas Papadimitriou
        }
676 a37c5497 Kostas Papadimitriou
      },
677 a37c5497 Kostas Papadimitriou
678 a37c5497 Kostas Papadimitriou
      post_remove_model_view: function(view) {
679 a37c5497 Kostas Papadimitriou
        view.unbind("change:select", this.trigger_select, this);
680 a37c5497 Kostas Papadimitriou
      },
681 a37c5497 Kostas Papadimitriou
682 a37c5497 Kostas Papadimitriou
      deselect_all: function(except) {
683 a37c5497 Kostas Papadimitriou
        _.each(this._subviews, function(view) {
684 a37c5497 Kostas Papadimitriou
          if (view != except) { view.deselect() }
685 a37c5497 Kostas Papadimitriou
        });
686 a37c5497 Kostas Papadimitriou
      },
687 a37c5497 Kostas Papadimitriou
688 a37c5497 Kostas Papadimitriou
      get_selected: function() {
689 a37c5497 Kostas Papadimitriou
        return _.filter(_.map(this._subviews, function(view) {
690 a37c5497 Kostas Papadimitriou
          if (view.selected) {
691 a37c5497 Kostas Papadimitriou
            return view.model;
692 a37c5497 Kostas Papadimitriou
          }
693 a37c5497 Kostas Papadimitriou
        }), function(m) { return m });
694 a37c5497 Kostas Papadimitriou
      }
695 a37c5497 Kostas Papadimitriou
    });
696 664f05f0 Kostas Papadimitriou
697 664f05f0 Kostas Papadimitriou
    views.NetworkConnectVMsOverlay = views.Overlay.extend({
698 664f05f0 Kostas Papadimitriou
        title: "Connect machine",
699 664f05f0 Kostas Papadimitriou
        overlay_id: "overlay-select-vms",
700 664f05f0 Kostas Papadimitriou
        content_selector: "#network-vms-select-content",
701 664f05f0 Kostas Papadimitriou
        css_class: "overlay-info",
702 664f05f0 Kostas Papadimitriou
        allow_multiple: true,
703 8d08f18a Kostas Papadimitriou
704 664f05f0 Kostas Papadimitriou
        initialize: function() {
705 664f05f0 Kostas Papadimitriou
            views.NetworkConnectVMsOverlay.__super__.initialize.apply(this);
706 664f05f0 Kostas Papadimitriou
            this.list = this.$(".vms-list ul");
707 664f05f0 Kostas Papadimitriou
            this.empty_message = this.$(".empty-message");
708 664f05f0 Kostas Papadimitriou
            // flag for submit handler to avoid duplicate bindings
709 664f05f0 Kostas Papadimitriou
            this.submit_handler_set = false;
710 664f05f0 Kostas Papadimitriou
            this.in_progress = false;
711 a37c5497 Kostas Papadimitriou
712 8d08f18a Kostas Papadimitriou
        },
713 8d08f18a Kostas Papadimitriou
        
714 a37c5497 Kostas Papadimitriou
        init_collection_view: function(collection) {
715 a37c5497 Kostas Papadimitriou
            this.collection_view = new views.VMSelectView({
716 a37c5497 Kostas Papadimitriou
              collection: collection,
717 a37c5497 Kostas Papadimitriou
              el: this.list,
718 a37c5497 Kostas Papadimitriou
              allow_multiple: this.allow_multiple
719 a37c5497 Kostas Papadimitriou
            });
720 a37c5497 Kostas Papadimitriou
            this.collection_view.show(true);
721 a37c5497 Kostas Papadimitriou
            this.list.append($(this.collection_view.el));
722 a37c5497 Kostas Papadimitriou
            if (!this.allow_multiple) {
723 a37c5497 Kostas Papadimitriou
              this.collection_view.bind("change:select", 
724 a37c5497 Kostas Papadimitriou
                                        function(view, selected) {
725 a37c5497 Kostas Papadimitriou
                if (!selected) { return }
726 a37c5497 Kostas Papadimitriou
                this.collection_view.deselect_all(view);
727 a37c5497 Kostas Papadimitriou
              }, this);
728 a37c5497 Kostas Papadimitriou
            }
729 a37c5497 Kostas Papadimitriou
        },
730 a37c5497 Kostas Papadimitriou
731 664f05f0 Kostas Papadimitriou
        handle_vm_click: function(el) {
732 664f05f0 Kostas Papadimitriou
            if (!this.allow_multiple) {
733 664f05f0 Kostas Papadimitriou
              $(el).closest("ul").find(".selected").removeClass("selected");
734 664f05f0 Kostas Papadimitriou
              $(el).addClass("selected");
735 664f05f0 Kostas Papadimitriou
            } else {
736 664f05f0 Kostas Papadimitriou
              $(el).toggleClass("selected");
737 664f05f0 Kostas Papadimitriou
            }
738 126a01f2 Kostas Papadimitriou
        },
739 126a01f2 Kostas Papadimitriou
740 8d08f18a Kostas Papadimitriou
        init_handlers: function() {
741 664f05f0 Kostas Papadimitriou
            var self = this;
742 664f05f0 Kostas Papadimitriou
            
743 664f05f0 Kostas Papadimitriou
            if (!this.submit_handler_set) {
744 664f05f0 Kostas Papadimitriou
                // avoid duplicate submits
745 664f05f0 Kostas Papadimitriou
                this.el.find(".create, .assign").click(_.bind(function() {
746 664f05f0 Kostas Papadimitriou
                  if (!this.in_progress) {
747 664f05f0 Kostas Papadimitriou
                    this.submit();
748 664f05f0 Kostas Papadimitriou
                  }
749 101e6604 Kostas Papadimitriou
                }, this));
750 664f05f0 Kostas Papadimitriou
                this.submit_handler_set = true;
751 8d08f18a Kostas Papadimitriou
            }
752 101e6604 Kostas Papadimitriou
        },
753 a37c5497 Kostas Papadimitriou
        
754 a37c5497 Kostas Papadimitriou
        reset: function() {},
755 664f05f0 Kostas Papadimitriou
        beforeOpen: function() {
756 664f05f0 Kostas Papadimitriou
            this.reset();
757 664f05f0 Kostas Papadimitriou
            this.update_layout();
758 664f05f0 Kostas Papadimitriou
        },
759 664f05f0 Kostas Papadimitriou
        
760 664f05f0 Kostas Papadimitriou
        get_selected: function() {
761 a37c5497 Kostas Papadimitriou
          return this.collection_view.get_selected();
762 8d08f18a Kostas Papadimitriou
        },
763 8d08f18a Kostas Papadimitriou
764 8d08f18a Kostas Papadimitriou
        update_layout: function() {
765 664f05f0 Kostas Papadimitriou
            this.unset_in_progress();
766 664f05f0 Kostas Papadimitriou
            this.in_progress = false;
767 126a01f2 Kostas Papadimitriou
768 664f05f0 Kostas Papadimitriou
            if (this.vms.length == 0) {
769 664f05f0 Kostas Papadimitriou
                this.empty_message.show();
770 126a01f2 Kostas Papadimitriou
            } else {
771 664f05f0 Kostas Papadimitriou
                this.empty_message.hide();
772 126a01f2 Kostas Papadimitriou
            }
773 8d08f18a Kostas Papadimitriou
774 8d08f18a Kostas Papadimitriou
            this.init_handlers();
775 8d08f18a Kostas Papadimitriou
        },
776 8d08f18a Kostas Papadimitriou
777 664f05f0 Kostas Papadimitriou
        set_in_progress: function() {
778 664f05f0 Kostas Papadimitriou
          this.$(".form-action").addClass("in-progress");
779 664f05f0 Kostas Papadimitriou
          this.in_progress = true;
780 8d08f18a Kostas Papadimitriou
        },
781 8d08f18a Kostas Papadimitriou
782 664f05f0 Kostas Papadimitriou
        unset_in_progress: function() {
783 664f05f0 Kostas Papadimitriou
          this.$(".form-action").removeClass("in-progress");
784 664f05f0 Kostas Papadimitriou
          this.in_progress = false;
785 8d08f18a Kostas Papadimitriou
        },
786 8d08f18a Kostas Papadimitriou
787 664f05f0 Kostas Papadimitriou
        show_vms: function(network, vms, selected, callback, subtitle) {
788 a37c5497 Kostas Papadimitriou
            this.init_collection_view(vms);
789 664f05f0 Kostas Papadimitriou
            this.network = network;
790 664f05f0 Kostas Papadimitriou
            this.reset();
791 664f05f0 Kostas Papadimitriou
            if (network) {
792 664f05f0 Kostas Papadimitriou
              this.set_subtitle(network.escape("name"));
793 8d08f18a Kostas Papadimitriou
            } else {
794 664f05f0 Kostas Papadimitriou
              this.set_subtitle(subtitle);
795 8d08f18a Kostas Papadimitriou
            }
796 664f05f0 Kostas Papadimitriou
            this.vms = vms;
797 664f05f0 Kostas Papadimitriou
            this.selected = selected;
798 664f05f0 Kostas Papadimitriou
            this.cb = callback;
799 664f05f0 Kostas Papadimitriou
            this.unset_in_progress();
800 664f05f0 Kostas Papadimitriou
            this.show(true);
801 664f05f0 Kostas Papadimitriou
        },
802 a37c5497 Kostas Papadimitriou
        
803 a37c5497 Kostas Papadimitriou
        onClose: function() {
804 6b52c29c Kostas Papadimitriou
          this.collection_view && this.collection_view.hide(true);
805 a37c5497 Kostas Papadimitriou
          delete this.collection_view;
806 a37c5497 Kostas Papadimitriou
        },
807 8d08f18a Kostas Papadimitriou
808 8d08f18a Kostas Papadimitriou
        submit: function() {
809 664f05f0 Kostas Papadimitriou
            if (!this.get_selected().length) { return }
810 664f05f0 Kostas Papadimitriou
            this.cb(this.get_selected());
811 8d08f18a Kostas Papadimitriou
        }
812 8d08f18a Kostas Papadimitriou
    });
813 c68ad72e Kostas Papadimitriou
    
814 a37c5497 Kostas Papadimitriou
    views.NetworkSelectModelView = views.ext.SelectModelView.extend({});
815 c68ad72e Kostas Papadimitriou
816 c68ad72e Kostas Papadimitriou
    views.NetworkSelectNetworkTypeModelView = views.NetworkSelectModelView.extend({
817 c68ad72e Kostas Papadimitriou
      get_network_icon: function() {
818 c68ad72e Kostas Papadimitriou
        var ico = this.model.get('is_public') ? 'internet-small.png' : 'network-small.png';
819 c68ad72e Kostas Papadimitriou
        return synnefo.config.media_url + 'images/' + ico;
820 c68ad72e Kostas Papadimitriou
      },
821 c68ad72e Kostas Papadimitriou
      forced_title: 'You machine will be automatically connected ' +
822 c68ad72e Kostas Papadimitriou
                    'to this network.'
823 c68ad72e Kostas Papadimitriou
    });
824 c68ad72e Kostas Papadimitriou
825 c68ad72e Kostas Papadimitriou
    views.NetworkSelectPublicNetwork = views.NetworkSelectNetworkTypeModelView.extend({
826 c68ad72e Kostas Papadimitriou
      tpl: '#networks-select-public-item-tpl',
827 c68ad72e Kostas Papadimitriou
      classes: 'public-network',
828 c68ad72e Kostas Papadimitriou
      post_init_element: function() {
829 c68ad72e Kostas Papadimitriou
        views.NetworkSelectPublicNetwork.__super__.post_init_element.apply(this);
830 c68ad72e Kostas Papadimitriou
      }
831 c68ad72e Kostas Papadimitriou
    });
832 c68ad72e Kostas Papadimitriou
833 c68ad72e Kostas Papadimitriou
    views.NetworkSelectPrivateNetwork = views.NetworkSelectNetworkTypeModelView.extend({
834 c68ad72e Kostas Papadimitriou
      tpl: '#networks-select-private-item-tpl',
835 c68ad72e Kostas Papadimitriou
      classes: 'private-network'
836 c68ad72e Kostas Papadimitriou
    });
837 c68ad72e Kostas Papadimitriou
    
838 c68ad72e Kostas Papadimitriou
    views.NetworkSelectTypeView = views.ext.CollectionView.extend({});
839 c68ad72e Kostas Papadimitriou
    views.NetworkSelectPublicNetworks = views.NetworkSelectTypeView.extend({
840 c68ad72e Kostas Papadimitriou
      tpl: '#networks-select-public-tpl',
841 c68ad72e Kostas Papadimitriou
      model_view_cls: views.NetworkSelectPublicNetwork,
842 c68ad72e Kostas Papadimitriou
      get_floating_ips: function() {
843 4bf6778f Kostas Papadimitriou
        var ips = [];
844 4bf6778f Kostas Papadimitriou
        _.each(this._subviews, function(view) {
845 4bf6778f Kostas Papadimitriou
          _.each(view._subviews, function(view) {
846 4bf6778f Kostas Papadimitriou
            if (view.selected_ips) {
847 4bf6778f Kostas Papadimitriou
              _.each(view.selected_ips, function(m) {
848 4bf6778f Kostas Papadimitriou
                ips.push(m.id);
849 4bf6778f Kostas Papadimitriou
              }, this);
850 4bf6778f Kostas Papadimitriou
            }
851 4bf6778f Kostas Papadimitriou
          }, this);
852 4bf6778f Kostas Papadimitriou
        }, this);
853 4bf6778f Kostas Papadimitriou
        return ips;
854 c68ad72e Kostas Papadimitriou
      }
855 c68ad72e Kostas Papadimitriou
    });
856 c68ad72e Kostas Papadimitriou
    
857 c68ad72e Kostas Papadimitriou
    views.NetworkSelectFloatingIpView = views.NetworkSelectModelView.extend({
858 c68ad72e Kostas Papadimitriou
      tpl: '#networks-select-floating-ip-tpl'
859 c68ad72e Kostas Papadimitriou
    });
860 c68ad72e Kostas Papadimitriou
861 c68ad72e Kostas Papadimitriou
    views.NetworkSelectFloatingIpsView = views.ext.CollectionView.extend({
862 c68ad72e Kostas Papadimitriou
      tpl: '#networks-select-floating-ips-tpl',
863 c68ad72e Kostas Papadimitriou
      model_view_cls: views.NetworkSelectFloatingIpView,
864 c68ad72e Kostas Papadimitriou
865 c68ad72e Kostas Papadimitriou
      deselect_all: function() {
866 c68ad72e Kostas Papadimitriou
        this.each_ip_view(function(v) { v.deselect() });
867 c68ad72e Kostas Papadimitriou
      },
868 c68ad72e Kostas Papadimitriou
869 c68ad72e Kostas Papadimitriou
      each_ip_view: function(cb) {
870 c68ad72e Kostas Papadimitriou
        _.each(this._subviews, function(view) {
871 c68ad72e Kostas Papadimitriou
          if (view instanceof views.NetworkSelectFloatingIpView) {
872 c68ad72e Kostas Papadimitriou
            cb(view);
873 c68ad72e Kostas Papadimitriou
          }
874 c68ad72e Kostas Papadimitriou
        })
875 c68ad72e Kostas Papadimitriou
      },
876 c68ad72e Kostas Papadimitriou
877 c68ad72e Kostas Papadimitriou
      post_init: function() {
878 c68ad72e Kostas Papadimitriou
        var parent = this.parent_view;
879 c68ad72e Kostas Papadimitriou
        var self = this;
880 9c8f31ad Kostas Papadimitriou
881 9c8f31ad Kostas Papadimitriou
        this.quota = synnefo.storage.quotas.get("cyclades.floating_ip");
882 9c8f31ad Kostas Papadimitriou
        this.selected_ips = [];
883 c68ad72e Kostas Papadimitriou
        this.handle_ip_select = _.bind(this.handle_ip_select, this);
884 c68ad72e Kostas Papadimitriou
        this.create = this.$(".floating-ip.create");
885 9c8f31ad Kostas Papadimitriou
        
886 9c8f31ad Kostas Papadimitriou
        this.quota.bind("change", _.bind(this.update_available, this));
887 9c8f31ad Kostas Papadimitriou
        this.collection.bind("change", _.bind(this.update_available, this))
888 9c8f31ad Kostas Papadimitriou
        this.collection.bind("add", _.bind(this.update_available, this))
889 9c8f31ad Kostas Papadimitriou
        this.collection.bind("remove", _.bind(this.update_available, this))
890 c68ad72e Kostas Papadimitriou
891 9c8f31ad Kostas Papadimitriou
        parent.bind("change:select", function(view, selected) {
892 9c8f31ad Kostas Papadimitriou
          if (selected) { this.show_parent() } else { this.hide_parent() }
893 9c8f31ad Kostas Papadimitriou
        }, this);
894 9c8f31ad Kostas Papadimitriou
895 9c8f31ad Kostas Papadimitriou
        this.create.click(function(e) {
896 9c8f31ad Kostas Papadimitriou
          e.preventDefault();
897 c68ad72e Kostas Papadimitriou
          self.create_ip();
898 9c8f31ad Kostas Papadimitriou
        });
899 213a8396 Kostas Papadimitriou
        this.reset_creating();
900 c68ad72e Kostas Papadimitriou
      },
901 c68ad72e Kostas Papadimitriou
      
902 9c8f31ad Kostas Papadimitriou
      hide_parent: function() {
903 9c8f31ad Kostas Papadimitriou
        this.parent_view.item.removeClass("selected");
904 9c8f31ad Kostas Papadimitriou
        this.parent_view.input.attr("checked", false);
905 9c8f31ad Kostas Papadimitriou
        this.parent_view.selected = false;
906 9c8f31ad Kostas Papadimitriou
        this.deselect_all();
907 9c8f31ad Kostas Papadimitriou
        this.hide(true);
908 9c8f31ad Kostas Papadimitriou
      },
909 9c8f31ad Kostas Papadimitriou
910 9c8f31ad Kostas Papadimitriou
      show_parent: function() {
911 9c8f31ad Kostas Papadimitriou
        var left = this.quota.get_available();
912 9c8f31ad Kostas Papadimitriou
        var available = this.collection.length || left;
913 9c8f31ad Kostas Papadimitriou
        if (!available) { 
914 9c8f31ad Kostas Papadimitriou
          this.hide_parent();
915 9c8f31ad Kostas Papadimitriou
          return;
916 9c8f31ad Kostas Papadimitriou
        }
917 69dac1ba Kostas Papadimitriou
        this.select_first();
918 9c8f31ad Kostas Papadimitriou
        this.parent_view.item.addClass("selected");
919 9c8f31ad Kostas Papadimitriou
        this.parent_view.input.attr("checked", true);
920 9c8f31ad Kostas Papadimitriou
        this.parent_view.selected = true;
921 9c8f31ad Kostas Papadimitriou
        this.show(true);
922 9c8f31ad Kostas Papadimitriou
      },
923 9c8f31ad Kostas Papadimitriou
924 9c8f31ad Kostas Papadimitriou
      update_available: function() {
925 9c8f31ad Kostas Papadimitriou
        var left = this.quota.get_available();
926 9c8f31ad Kostas Papadimitriou
        var available = this.collection.length || left;
927 9c8f31ad Kostas Papadimitriou
        var available_el = this.parent_view.$(".available");
928 9c8f31ad Kostas Papadimitriou
        var no_available_el = this.parent_view.$(".no-available");
929 e6a4b75c Kostas Papadimitriou
        var parent_check = this.parent_view.$("input[type=checkbox]");
930 9c8f31ad Kostas Papadimitriou
        var create = this.$(".create.model-item");
931 9c8f31ad Kostas Papadimitriou
        var create_link = this.$(".create a");
932 9c8f31ad Kostas Papadimitriou
        var create_no_available = this.$(".create .no-available");
933 9c8f31ad Kostas Papadimitriou
934 9c8f31ad Kostas Papadimitriou
        if (!available) {
935 9c8f31ad Kostas Papadimitriou
          // no ip's available to select
936 9c8f31ad Kostas Papadimitriou
          this.hide_parent();
937 9c8f31ad Kostas Papadimitriou
          available_el.hide();
938 9c8f31ad Kostas Papadimitriou
          no_available_el.show();
939 e6a4b75c Kostas Papadimitriou
          parent_check.attr("disabled", true);
940 9c8f31ad Kostas Papadimitriou
        } else {
941 9c8f31ad Kostas Papadimitriou
          // available floating ip
942 213a8396 Kostas Papadimitriou
          var available_text = "".format(
943 9c8f31ad Kostas Papadimitriou
            this.collection.length + this.quota.get_available());
944 9c8f31ad Kostas Papadimitriou
          available_el.removeClass("hidden").text(available_text).show();
945 9c8f31ad Kostas Papadimitriou
          available_el.show();
946 9c8f31ad Kostas Papadimitriou
          no_available_el.hide();
947 e6a4b75c Kostas Papadimitriou
          parent_check.attr("disabled", false);
948 9c8f31ad Kostas Papadimitriou
        }
949 9c8f31ad Kostas Papadimitriou
950 9c8f31ad Kostas Papadimitriou
        if (left) {
951 9c8f31ad Kostas Papadimitriou
          // available quota
952 9c8f31ad Kostas Papadimitriou
          create.removeClass("no-available");
953 9c8f31ad Kostas Papadimitriou
          create.show();
954 f8aa9fc3 Kostas Papadimitriou
          create_link.show();
955 9c8f31ad Kostas Papadimitriou
          create_no_available.hide();
956 9c8f31ad Kostas Papadimitriou
        } else {
957 9c8f31ad Kostas Papadimitriou
          // no available quota
958 9c8f31ad Kostas Papadimitriou
          create.addClass("no-available");
959 213a8396 Kostas Papadimitriou
          create.hide();
960 f8aa9fc3 Kostas Papadimitriou
          create_link.hide();
961 213a8396 Kostas Papadimitriou
          //create_no_available.show();
962 9c8f31ad Kostas Papadimitriou
        }
963 9c8f31ad Kostas Papadimitriou
        this.update_selected();
964 9c8f31ad Kostas Papadimitriou
      },
965 9c8f31ad Kostas Papadimitriou
      
966 9c8f31ad Kostas Papadimitriou
      update_selected: function() {
967 69dac1ba Kostas Papadimitriou
        // reset missing entries
968 213a8396 Kostas Papadimitriou
        _.each(this.selected_ips.length, function(ip) {
969 213a8396 Kostas Papadimitriou
          if (!this.collection.get(ip.id)) {
970 213a8396 Kostas Papadimitriou
            this.selected_ips = _.without(this.selected_ips, ip);
971 213a8396 Kostas Papadimitriou
          }
972 213a8396 Kostas Papadimitriou
        }, this);
973 213a8396 Kostas Papadimitriou
974 9c8f31ad Kostas Papadimitriou
        if (this.selected_ips.length) {
975 9c8f31ad Kostas Papadimitriou
          this.parent_view.input.attr("checked", true);
976 9c8f31ad Kostas Papadimitriou
          this.parent_view.item.addClass("selected");
977 69dac1ba Kostas Papadimitriou
          this.parent_view.selected = true;
978 9c8f31ad Kostas Papadimitriou
        } else {
979 9c8f31ad Kostas Papadimitriou
          this.parent_view.input.attr("checked", false);
980 9c8f31ad Kostas Papadimitriou
          this.parent_view.item.removeClass("selected");
981 69dac1ba Kostas Papadimitriou
          this.parent_view.selected = false;
982 9c8f31ad Kostas Papadimitriou
        }
983 c68ad72e Kostas Papadimitriou
      },
984 c68ad72e Kostas Papadimitriou
985 c68ad72e Kostas Papadimitriou
      post_remove_model_view: function(view) {
986 9c8f31ad Kostas Papadimitriou
        view.deselect();
987 c68ad72e Kostas Papadimitriou
        view.unbind("change:select", this.handle_ip_select)
988 c68ad72e Kostas Papadimitriou
      },
989 c68ad72e Kostas Papadimitriou
990 c68ad72e Kostas Papadimitriou
      handle_create_error: function() {},
991 213a8396 Kostas Papadimitriou
      
992 213a8396 Kostas Papadimitriou
      set_creating: function() {
993 213a8396 Kostas Papadimitriou
        var create_link = this.$(".create a");
994 213a8396 Kostas Papadimitriou
        var create_no_available = this.$(".create .no-available");
995 213a8396 Kostas Papadimitriou
        var loading = this.$(".create .loading");
996 213a8396 Kostas Papadimitriou
        create_link.hide();
997 213a8396 Kostas Papadimitriou
        loading.show();
998 213a8396 Kostas Papadimitriou
      },
999 213a8396 Kostas Papadimitriou
1000 213a8396 Kostas Papadimitriou
      reset_creating: function() {
1001 213a8396 Kostas Papadimitriou
        var loading = this.$(".create .loading");
1002 213a8396 Kostas Papadimitriou
        loading.hide();
1003 213a8396 Kostas Papadimitriou
        this.update_available();
1004 213a8396 Kostas Papadimitriou
      },
1005 c68ad72e Kostas Papadimitriou
1006 c68ad72e Kostas Papadimitriou
      create_ip: function() {
1007 9c8f31ad Kostas Papadimitriou
        if (!this.quota.get_available()) { return }
1008 213a8396 Kostas Papadimitriou
        var self = this;
1009 213a8396 Kostas Papadimitriou
        this.set_creating();
1010 c68ad72e Kostas Papadimitriou
        synnefo.storage.floating_ips.create({floatingip:{}}, {
1011 c68ad72e Kostas Papadimitriou
          error: _.bind(this.handle_create_error, this),
1012 213a8396 Kostas Papadimitriou
          complete: function() {
1013 213a8396 Kostas Papadimitriou
            synnefo.storage.quotas.fetch();
1014 213a8396 Kostas Papadimitriou
            self.reset_creating();
1015 e4330db2 Kostas Papadimitriou
          }
1016 c68ad72e Kostas Papadimitriou
        });
1017 c68ad72e Kostas Papadimitriou
      },
1018 69dac1ba Kostas Papadimitriou
      
1019 69dac1ba Kostas Papadimitriou
      select_first: function() {
1020 69dac1ba Kostas Papadimitriou
        if (this.selected_ips.length > 0) { return }
1021 69dac1ba Kostas Papadimitriou
        if (this._subviews.length == 0) { return }
1022 69dac1ba Kostas Papadimitriou
        this._subviews[0].select();
1023 69dac1ba Kostas Papadimitriou
        if (!_.contains(this.selected_ips, this._subviews[0].model)) {
1024 69dac1ba Kostas Papadimitriou
          this.selected_ips.push(this._subviews[0].model);
1025 69dac1ba Kostas Papadimitriou
        }
1026 69dac1ba Kostas Papadimitriou
      },
1027 c68ad72e Kostas Papadimitriou
1028 9c8f31ad Kostas Papadimitriou
      post_add_model_view: function(view, model) {
1029 9c8f31ad Kostas Papadimitriou
        view.bind("change:select", this.handle_ip_select)
1030 9c8f31ad Kostas Papadimitriou
        if (!this.selected_ips.length && this._subviews.length == 1) {
1031 69dac1ba Kostas Papadimitriou
          this.select_first();
1032 9c8f31ad Kostas Papadimitriou
        }
1033 9c8f31ad Kostas Papadimitriou
      },
1034 9c8f31ad Kostas Papadimitriou
1035 c68ad72e Kostas Papadimitriou
      handle_ip_select: function(view) {
1036 c68ad72e Kostas Papadimitriou
        if (view.selected) {
1037 9c8f31ad Kostas Papadimitriou
          if (!_.contains(this.selected_ips, view.model)) {
1038 9c8f31ad Kostas Papadimitriou
            this.selected_ips.push(view.model);
1039 9c8f31ad Kostas Papadimitriou
          }
1040 c68ad72e Kostas Papadimitriou
        } else {
1041 9c8f31ad Kostas Papadimitriou
          this.selected_ips = _.without(this.selected_ips, view.model);
1042 c68ad72e Kostas Papadimitriou
        }
1043 c68ad72e Kostas Papadimitriou
        this.update_selected();
1044 c68ad72e Kostas Papadimitriou
      },
1045 c68ad72e Kostas Papadimitriou
      
1046 c68ad72e Kostas Papadimitriou
      post_show: function() {
1047 9c8f31ad Kostas Papadimitriou
        this.update_available();
1048 c68ad72e Kostas Papadimitriou
      },
1049 c68ad72e Kostas Papadimitriou
1050 c68ad72e Kostas Papadimitriou
      get_floating_ips: function() {
1051 9c8f31ad Kostas Papadimitriou
        return this.selected_ips;
1052 c68ad72e Kostas Papadimitriou
      }
1053 c68ad72e Kostas Papadimitriou
    });
1054 c68ad72e Kostas Papadimitriou
1055 c68ad72e Kostas Papadimitriou
    views.NetworkSelectPrivateNetworks = views.NetworkSelectTypeView.extend({
1056 c68ad72e Kostas Papadimitriou
      tpl: '#networks-select-private-tpl',
1057 c68ad72e Kostas Papadimitriou
      model_view_cls: views.NetworkSelectPrivateNetwork,
1058 c68ad72e Kostas Papadimitriou
      get_networks: function() {
1059 c68ad72e Kostas Papadimitriou
        return _.filter(_.map(this._subviews, function(view) {
1060 c68ad72e Kostas Papadimitriou
          if (view.selected) { return view.model.id }
1061 c68ad72e Kostas Papadimitriou
        }), function(id) { return id });
1062 c68ad72e Kostas Papadimitriou
      }
1063 c68ad72e Kostas Papadimitriou
1064 c68ad72e Kostas Papadimitriou
    });
1065 c68ad72e Kostas Papadimitriou
1066 c68ad72e Kostas Papadimitriou
    views.NetworkSelectView = views.ext.ModelView.extend({
1067 c68ad72e Kostas Papadimitriou
      rivets_view: true,
1068 c68ad72e Kostas Papadimitriou
      tpl: '#networks-select-view-tpl',
1069 c68ad72e Kostas Papadimitriou
      select_public: true,
1070 4bf6778f Kostas Papadimitriou
      
1071 4bf6778f Kostas Papadimitriou
      forced_values_title_map: {
1072 213a8396 Kostas Papadimitriou
        "SNF:ANY_PUBLIC_IPV6": "Internet (public IPv6)",
1073 213a8396 Kostas Papadimitriou
        "SNF:ANY_PUBLIC_IPV4": "Internet (public IPv4)"
1074 4bf6778f Kostas Papadimitriou
      },
1075 c68ad72e Kostas Papadimitriou
1076 c68ad72e Kostas Papadimitriou
      initialize: function(options) {
1077 c68ad72e Kostas Papadimitriou
        this.quotas = synnefo.storage.quotas.get('cyclades.private_network');
1078 c68ad72e Kostas Papadimitriou
        options = options || {};
1079 c68ad72e Kostas Papadimitriou
        options.model = options.model || new models.Model();
1080 c68ad72e Kostas Papadimitriou
        this.private_networks = new Backbone.FilteredCollection(undefined, {
1081 c68ad72e Kostas Papadimitriou
          collection: synnefo.storage.networks,
1082 c68ad72e Kostas Papadimitriou
          collectionFilter: function(m) {
1083 c68ad72e Kostas Papadimitriou
            return !m.get('is_public')
1084 c68ad72e Kostas Papadimitriou
        }});
1085 c68ad72e Kostas Papadimitriou
1086 c68ad72e Kostas Papadimitriou
        this.public_networks = new Backbone.Collection();
1087 4bf6778f Kostas Papadimitriou
        this.public_networks.comparator = function(m) {
1088 4bf6778f Kostas Papadimitriou
          if (m.get('forced')) {
1089 4bf6778f Kostas Papadimitriou
            return -1
1090 4bf6778f Kostas Papadimitriou
          }  
1091 4bf6778f Kostas Papadimitriou
          return 100;
1092 4bf6778f Kostas Papadimitriou
        }
1093 4bf6778f Kostas Papadimitriou
        
1094 4bf6778f Kostas Papadimitriou
        if (synnefo.config.forced_server_networks.length) {
1095 4bf6778f Kostas Papadimitriou
          _.each(synnefo.config.forced_server_networks, function(network) {
1096 4bf6778f Kostas Papadimitriou
            var forced = synnefo.storage.networks.get(network);
1097 4bf6778f Kostas Papadimitriou
            if (!forced) {
1098 4bf6778f Kostas Papadimitriou
              var name = this.forced_values_title_map[network];
1099 4bf6778f Kostas Papadimitriou
              if (!name) { name = "Forced network ({0})".format(network)}
1100 4bf6778f Kostas Papadimitriou
              forced = new models.networks.Network({
1101 4bf6778f Kostas Papadimitriou
                id: network,
1102 4bf6778f Kostas Papadimitriou
                name: name, 
1103 4bf6778f Kostas Papadimitriou
                subnets: [],
1104 4bf6778f Kostas Papadimitriou
                is_public: true,
1105 4bf6778f Kostas Papadimitriou
                forced: true
1106 4bf6778f Kostas Papadimitriou
              });
1107 4bf6778f Kostas Papadimitriou
            } else {
1108 4bf6778f Kostas Papadimitriou
              forced.set({'forced': true});
1109 4bf6778f Kostas Papadimitriou
            }
1110 4bf6778f Kostas Papadimitriou
            this.public_networks.add(forced);
1111 4bf6778f Kostas Papadimitriou
          }, this);
1112 4bf6778f Kostas Papadimitriou
        }
1113 c68ad72e Kostas Papadimitriou
1114 c68ad72e Kostas Papadimitriou
        // combined public
1115 6368ca5d Kostas Papadimitriou
        this.floating_public = new models.networks.CombinedPublicNetwork('Internet');
1116 6368ca5d Kostas Papadimitriou
        this.floating_public.set({noselect: true, 
1117 213a8396 Kostas Papadimitriou
                                  name: 'Internet (public IPv4)', 
1118 213a8396 Kostas Papadimitriou
                                  forced: false});
1119 6368ca5d Kostas Papadimitriou
        this.public_networks.add(this.floating_public);
1120 c68ad72e Kostas Papadimitriou
1121 c68ad72e Kostas Papadimitriou
        model_attrs = {
1122 c68ad72e Kostas Papadimitriou
          public_collection: this.public_networks,
1123 c68ad72e Kostas Papadimitriou
          private_collection: this.private_networks,
1124 c68ad72e Kostas Papadimitriou
          floating_selected: true
1125 c68ad72e Kostas Papadimitriou
        }
1126 c68ad72e Kostas Papadimitriou
1127 c68ad72e Kostas Papadimitriou
        options.model.set(model_attrs);
1128 c68ad72e Kostas Papadimitriou
        this._configure(options);
1129 c68ad72e Kostas Papadimitriou
        return views.NetworkSelectView.__super__.initialize.call(this, options);
1130 c68ad72e Kostas Papadimitriou
      },
1131 c68ad72e Kostas Papadimitriou
1132 c68ad72e Kostas Papadimitriou
      get_selected_floating_ips: function() {
1133 c68ad72e Kostas Papadimitriou
        var ips = [];
1134 c68ad72e Kostas Papadimitriou
        _.each(this._subviews, function(view) {
1135 c68ad72e Kostas Papadimitriou
          if (view.get_floating_ips) {
1136 c68ad72e Kostas Papadimitriou
            ips = _.union(ips, view.get_floating_ips());
1137 c68ad72e Kostas Papadimitriou
          }
1138 c68ad72e Kostas Papadimitriou
        }, this);
1139 c68ad72e Kostas Papadimitriou
        return _.filter(
1140 c68ad72e Kostas Papadimitriou
          _.map(ips, function(ipid) { 
1141 c68ad72e Kostas Papadimitriou
          return synnefo.storage.floating_ips.get(parseInt(ipid))
1142 89dc40ca Kostas Papadimitriou
        }), function(ip) { return ip });
1143 c68ad72e Kostas Papadimitriou
      },
1144 c68ad72e Kostas Papadimitriou
1145 c68ad72e Kostas Papadimitriou
      get_selected_networks: function() {
1146 c68ad72e Kostas Papadimitriou
        var networks = [];
1147 c68ad72e Kostas Papadimitriou
        _.each(this._subviews, function(view) {
1148 c68ad72e Kostas Papadimitriou
          if (view.get_networks) {
1149 c68ad72e Kostas Papadimitriou
            networks = _.union(networks, view.get_networks());
1150 c68ad72e Kostas Papadimitriou
          }
1151 c68ad72e Kostas Papadimitriou
        }, this);
1152 c68ad72e Kostas Papadimitriou
        return _.filter(
1153 c68ad72e Kostas Papadimitriou
          _.map(networks, function(netid) { 
1154 c68ad72e Kostas Papadimitriou
          return synnefo.storage.networks.get(netid)
1155 c68ad72e Kostas Papadimitriou
        }), function(net) { return net });
1156 c68ad72e Kostas Papadimitriou
      }
1157 c68ad72e Kostas Papadimitriou
    });
1158 664f05f0 Kostas Papadimitriou
 
1159 8d08f18a Kostas Papadimitriou
})(this);