Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (44.2 kB)

1 00469232 Kostas Papadimitriou
// Copyright 2011 GRNET S.A. All rights reserved.
2 00469232 Kostas Papadimitriou
// 
3 00469232 Kostas Papadimitriou
// Redistribution and use in source and binary forms, with or
4 00469232 Kostas Papadimitriou
// without modification, are permitted provided that the following
5 00469232 Kostas Papadimitriou
// conditions are met:
6 00469232 Kostas Papadimitriou
// 
7 00469232 Kostas Papadimitriou
//   1. Redistributions of source code must retain the above
8 00469232 Kostas Papadimitriou
//      copyright notice, this list of conditions and the following
9 00469232 Kostas Papadimitriou
//      disclaimer.
10 00469232 Kostas Papadimitriou
// 
11 00469232 Kostas Papadimitriou
//   2. Redistributions in binary form must reproduce the above
12 00469232 Kostas Papadimitriou
//      copyright notice, this list of conditions and the following
13 00469232 Kostas Papadimitriou
//      disclaimer in the documentation and/or other materials
14 00469232 Kostas Papadimitriou
//      provided with the distribution.
15 00469232 Kostas Papadimitriou
// 
16 00469232 Kostas Papadimitriou
// THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 00469232 Kostas Papadimitriou
// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 00469232 Kostas Papadimitriou
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 00469232 Kostas Papadimitriou
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 00469232 Kostas Papadimitriou
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 00469232 Kostas Papadimitriou
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 00469232 Kostas Papadimitriou
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 00469232 Kostas Papadimitriou
// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 00469232 Kostas Papadimitriou
// AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 00469232 Kostas Papadimitriou
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 00469232 Kostas Papadimitriou
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 00469232 Kostas Papadimitriou
// POSSIBILITY OF SUCH DAMAGE.
28 00469232 Kostas Papadimitriou
// 
29 00469232 Kostas Papadimitriou
// The views and conclusions contained in the software and
30 00469232 Kostas Papadimitriou
// documentation are those of the authors and should not be
31 00469232 Kostas Papadimitriou
// interpreted as representing official policies, either expressed
32 00469232 Kostas Papadimitriou
// or implied, of GRNET S.A.
33 00469232 Kostas Papadimitriou
// 
34 00469232 Kostas Papadimitriou
35 8d08f18a Kostas Papadimitriou
;(function(root){
36 8d08f18a Kostas Papadimitriou
    
37 8d08f18a Kostas Papadimitriou
    // root
38 8d08f18a Kostas Papadimitriou
    var root = root;
39 8d08f18a Kostas Papadimitriou
    
40 8d08f18a Kostas Papadimitriou
    // setup namepsaces
41 8d08f18a Kostas Papadimitriou
    var snf = root.synnefo = root.synnefo || {};
42 8d08f18a Kostas Papadimitriou
    var models = snf.models = snf.models || {}
43 8d08f18a Kostas Papadimitriou
    var storage = snf.storage = snf.storage || {};
44 8d08f18a Kostas Papadimitriou
    var ui = snf.ui = snf.ui || {};
45 8d08f18a Kostas Papadimitriou
    var util = snf.util || {};
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
    
56 8d08f18a Kostas Papadimitriou
    views.NetworkConnectVMsOverlay = views.Overlay.extend({
57 8d08f18a Kostas Papadimitriou
        title: "Connect machine",
58 8d08f18a Kostas Papadimitriou
        overlay_id: "overlay-select-vms",
59 8d08f18a Kostas Papadimitriou
        content_selector: "#network-vms-select-content",
60 8d08f18a Kostas Papadimitriou
        css_class: "overlay-info",
61 8d08f18a Kostas Papadimitriou
62 8d08f18a Kostas Papadimitriou
        initialize: function() {
63 8d08f18a Kostas Papadimitriou
            views.NetworkConnectVMsOverlay.__super__.initialize.apply(this);
64 8d08f18a Kostas Papadimitriou
            this.list = this.$(".vms-list ul");
65 8d08f18a Kostas Papadimitriou
            this.empty_message = this.$(".empty-message");
66 236223aa Kostas Papadimitriou
67 236223aa Kostas Papadimitriou
            // flag for submit handler to avoid duplicate bindings
68 236223aa Kostas Papadimitriou
            this.submit_handler_set = false;
69 8d08f18a Kostas Papadimitriou
        },
70 8d08f18a Kostas Papadimitriou
        
71 8d08f18a Kostas Papadimitriou
        init_handlers: function() {
72 8d08f18a Kostas Papadimitriou
            var self = this;
73 8d08f18a Kostas Papadimitriou
            this.list.find("li").click(function(){
74 8d08f18a Kostas Papadimitriou
                $(this).toggleClass("selected");
75 8d08f18a Kostas Papadimitriou
            });
76 236223aa Kostas Papadimitriou
            
77 236223aa Kostas Papadimitriou
            if (!this.submit_handler_set) {
78 236223aa Kostas Papadimitriou
                // avoid duplicate submits
79 236223aa Kostas Papadimitriou
                this.el.find(".create").click(_.bind(function() {
80 236223aa Kostas Papadimitriou
                    this.submit();
81 236223aa Kostas Papadimitriou
                }, this));
82 236223aa Kostas Papadimitriou
                this.submit_handler_set = true;
83 236223aa Kostas Papadimitriou
            }
84 8d08f18a Kostas Papadimitriou
        },
85 8d08f18a Kostas Papadimitriou
86 8d08f18a Kostas Papadimitriou
        reset: function() {
87 8d08f18a Kostas Papadimitriou
            this.list.find("li").remove();
88 8d08f18a Kostas Papadimitriou
        },
89 8d08f18a Kostas Papadimitriou
90 8d08f18a Kostas Papadimitriou
        beforeOpen: function() {
91 8d08f18a Kostas Papadimitriou
            this.reset();
92 8d08f18a Kostas Papadimitriou
            this.update_layout();
93 8d08f18a Kostas Papadimitriou
        },
94 8d08f18a Kostas Papadimitriou
        
95 8d08f18a Kostas Papadimitriou
        vm: function(vm) {
96 8d08f18a Kostas Papadimitriou
            if (vm.id) { var id = vm.id } else {var id = vm}
97 8d08f18a Kostas Papadimitriou
            return this.list.find(".vm-" + id);
98 8d08f18a Kostas Papadimitriou
        },
99 8d08f18a Kostas Papadimitriou
100 8d08f18a Kostas Papadimitriou
        get_selected: function() {
101 8d08f18a Kostas Papadimitriou
            return this.list.find(".selected").map(function() {return $(this).data('vm')})
102 8d08f18a Kostas Papadimitriou
        },
103 8d08f18a Kostas Papadimitriou
104 8d08f18a Kostas Papadimitriou
        update_layout: function() {
105 3450cf0d Kostas Papadimitriou
            if (this.vms.length == 0) {
106 8d08f18a Kostas Papadimitriou
                this.empty_message.show();
107 8d08f18a Kostas Papadimitriou
            } else {
108 8d08f18a Kostas Papadimitriou
                this.empty_message.hide();
109 8d08f18a Kostas Papadimitriou
            }
110 3450cf0d Kostas Papadimitriou
111 8d08f18a Kostas Papadimitriou
            _.each(this.vms, _.bind(function(vm){
112 126a01f2 Kostas Papadimitriou
                
113 8d08f18a Kostas Papadimitriou
                var html = '<li class="vm option options-object vm-{0}">' +
114 8d08f18a Kostas Papadimitriou
                           '<div class="options-object-cont">' +
115 8d08f18a Kostas Papadimitriou
                           '{2}' + 
116 8d08f18a Kostas Papadimitriou
                           '<span class="title">{1}</span>' + 
117 8d08f18a Kostas Papadimitriou
                           '<span class="value">{3}</span></div>' + 
118 8d08f18a Kostas Papadimitriou
                           '</li>';
119 8d08f18a Kostas Papadimitriou
                var el = $(html.format(vm.id, 
120 df251d55 Kostas Papadimitriou
                                       util.truncate(_.escape(vm.get("name")), 23), 
121 8d08f18a Kostas Papadimitriou
                                       snf.ui.helpers.vm_icon_tag(vm, "small", {'class':'os'}),
122 df251d55 Kostas Papadimitriou
                                       _.escape(vm.get_os())
123 8d08f18a Kostas Papadimitriou
                                      ))
124 126a01f2 Kostas Papadimitriou
                el.data({vm:vm, vm_id:vm.id})
125 8d08f18a Kostas Papadimitriou
                this.list.append(el);
126 8d08f18a Kostas Papadimitriou
127 8d08f18a Kostas Papadimitriou
                vm.bind("remove", function(){ el.remove()})
128 8d08f18a Kostas Papadimitriou
                vm.bind("change:name", function(i,v){el.find(".title").text(v)})
129 8d08f18a Kostas Papadimitriou
            }, this));
130 236223aa Kostas Papadimitriou
            
131 8d08f18a Kostas Papadimitriou
            this.init_handlers();
132 8d08f18a Kostas Papadimitriou
            this.set_selected();
133 8d08f18a Kostas Papadimitriou
        },
134 8d08f18a Kostas Papadimitriou
135 8d08f18a Kostas Papadimitriou
        set_selected: function() {
136 8d08f18a Kostas Papadimitriou
            _.each(this.selected, _.bind(function(el){
137 8d08f18a Kostas Papadimitriou
                this.vm(el).addClass("selected");
138 8d08f18a Kostas Papadimitriou
            }, this));
139 8d08f18a Kostas Papadimitriou
        },
140 8d08f18a Kostas Papadimitriou
141 8d08f18a Kostas Papadimitriou
        show_vms: function(network, vms, selected, callback) {
142 8d08f18a Kostas Papadimitriou
            this.network = network;
143 8d08f18a Kostas Papadimitriou
            this.reset();
144 df251d55 Kostas Papadimitriou
            this.set_subtitle(network.escape("name"));
145 8d08f18a Kostas Papadimitriou
            this.vms = vms;
146 126a01f2 Kostas Papadimitriou
            if (!synnefo.config.network_allow_duplicate_vm_nics) {
147 126a01f2 Kostas Papadimitriou
                this.vms = _.filter(this.vms, function(vm) {
148 126a01f2 Kostas Papadimitriou
                    return !vm.connected_to(this.network);
149 126a01f2 Kostas Papadimitriou
                }, this);
150 126a01f2 Kostas Papadimitriou
            }
151 126a01f2 Kostas Papadimitriou
152 8d08f18a Kostas Papadimitriou
            this.selected = selected;
153 8d08f18a Kostas Papadimitriou
            this.cb = callback;
154 8d08f18a Kostas Papadimitriou
            this.show();
155 8d08f18a Kostas Papadimitriou
        },
156 8d08f18a Kostas Papadimitriou
157 8d08f18a Kostas Papadimitriou
        submit: function() {
158 8d08f18a Kostas Papadimitriou
            this.cb(this.get_selected());
159 8d08f18a Kostas Papadimitriou
        }
160 8d08f18a Kostas Papadimitriou
    })
161 8d08f18a Kostas Papadimitriou
162 8d08f18a Kostas Papadimitriou
    views.NetworkActionsView = views.View.extend({
163 8d08f18a Kostas Papadimitriou
        
164 8d08f18a Kostas Papadimitriou
        initialize: function(view, net, el, opts) {
165 8d08f18a Kostas Papadimitriou
            this.parent = view
166 8d08f18a Kostas Papadimitriou
            this.network = net;
167 8d08f18a Kostas Papadimitriou
            this.el = el;
168 8d08f18a Kostas Papadimitriou
            
169 8d08f18a Kostas Papadimitriou
            this.actions = this.$(".actions");
170 8d08f18a Kostas Papadimitriou
            this.selected = undefined;
171 8d08f18a Kostas Papadimitriou
172 8d08f18a Kostas Papadimitriou
            this.destroy = this.$(".actions .destroy a");
173 8d08f18a Kostas Papadimitriou
            this.connect = this.$(".actions .add");
174 8d08f18a Kostas Papadimitriou
175 8d08f18a Kostas Papadimitriou
            this.init_handlers();
176 8d08f18a Kostas Papadimitriou
            this.update_layout();
177 8d08f18a Kostas Papadimitriou
        },
178 8d08f18a Kostas Papadimitriou
179 8d08f18a Kostas Papadimitriou
        init_handlers: function() {
180 8d08f18a Kostas Papadimitriou
            this.connect.click(_.bind(function(e){
181 8d08f18a Kostas Papadimitriou
                e.preventDefault();
182 8d08f18a Kostas Papadimitriou
            }))
183 8d08f18a Kostas Papadimitriou
        },
184 8d08f18a Kostas Papadimitriou
185 8d08f18a Kostas Papadimitriou
        update_layout: function() {
186 8d08f18a Kostas Papadimitriou
        }
187 8d08f18a Kostas Papadimitriou
    });
188 8d08f18a Kostas Papadimitriou
189 8d08f18a Kostas Papadimitriou
    views.NetworkCreateView = views.Overlay.extend({
190 8d08f18a Kostas Papadimitriou
        view_id: "network_create_view",
191 8d08f18a Kostas Papadimitriou
        content_selector: "#networks-create-content",
192 8d08f18a Kostas Papadimitriou
        css_class: 'overlay-networks-create overlay-info',
193 8d08f18a Kostas Papadimitriou
        overlay_id: "network-create-overlay",
194 8d08f18a Kostas Papadimitriou
195 8d08f18a Kostas Papadimitriou
        title: "Create new private network",
196 8d08f18a Kostas Papadimitriou
        subtitle: "Networks",
197 8d08f18a Kostas Papadimitriou
198 8d08f18a Kostas Papadimitriou
        initialize: function(options) {
199 8d08f18a Kostas Papadimitriou
            views.NetworkCreateView.__super__.initialize.apply(this);
200 8d08f18a Kostas Papadimitriou
201 8d08f18a Kostas Papadimitriou
            this.create_button = this.$("form .form-action.create");
202 8d08f18a Kostas Papadimitriou
            this.text = this.$(".network-create-name");
203 8d08f18a Kostas Papadimitriou
            this.form = this.$("form");
204 126a01f2 Kostas Papadimitriou
205 126a01f2 Kostas Papadimitriou
            this.dhcp_select = this.$("#network-create-dhcp");
206 126a01f2 Kostas Papadimitriou
            this.type_select = this.$("#network-create-type");
207 126a01f2 Kostas Papadimitriou
            this.subnet_select = this.$("#network-create-subnet");
208 126a01f2 Kostas Papadimitriou
            this.subnet_custom = this.$("#network-create-subnet-custom");
209 126a01f2 Kostas Papadimitriou
                
210 126a01f2 Kostas Papadimitriou
            this.dhcp_form = this.$("#network-create-dhcp-fields");
211 126a01f2 Kostas Papadimitriou
            
212 126a01f2 Kostas Papadimitriou
            this.subnet_select.find(".subnet").remove();
213 126a01f2 Kostas Papadimitriou
            _.each(synnefo.config.network_suggested_subnets, function(subnet){
214 126a01f2 Kostas Papadimitriou
                this.subnet_select.append($('<option value='+subnet+' class="subnet">'+subnet+'</option>'));
215 126a01f2 Kostas Papadimitriou
            }, this);
216 126a01f2 Kostas Papadimitriou
217 126a01f2 Kostas Papadimitriou
            this.type_select.find(".subnet").remove();
218 126a01f2 Kostas Papadimitriou
            _.each(synnefo.config.network_available_types, function(name, value){
219 126a01f2 Kostas Papadimitriou
                this.type_select.append($('<option value='+value+' class="subnet">'+name+'</option>'));
220 126a01f2 Kostas Papadimitriou
            }, this);
221 126a01f2 Kostas Papadimitriou
            
222 126a01f2 Kostas Papadimitriou
            this.disable_network_type = false;
223 126a01f2 Kostas Papadimitriou
            if (_.keys(synnefo.config.network_available_types).length <= 1) {
224 126a01f2 Kostas Papadimitriou
                this.disable_network_type = true;
225 126a01f2 Kostas Papadimitriou
                this.type_select.closest(".form-field").hide();
226 126a01f2 Kostas Papadimitriou
            }
227 126a01f2 Kostas Papadimitriou
228 126a01f2 Kostas Papadimitriou
            this.check_dhcp_form();
229 8d08f18a Kostas Papadimitriou
            this.init_handlers();
230 8d08f18a Kostas Papadimitriou
        },
231 8d08f18a Kostas Papadimitriou
232 126a01f2 Kostas Papadimitriou
        check_dhcp_form: function() {
233 126a01f2 Kostas Papadimitriou
            if (this.dhcp_select.is(":checked")) {
234 126a01f2 Kostas Papadimitriou
                this.dhcp_form.show();
235 126a01f2 Kostas Papadimitriou
            } else {
236 126a01f2 Kostas Papadimitriou
                this.dhcp_form.hide();
237 126a01f2 Kostas Papadimitriou
            }
238 126a01f2 Kostas Papadimitriou
            
239 126a01f2 Kostas Papadimitriou
            if (this.subnet_select.val() == "custom") {
240 126a01f2 Kostas Papadimitriou
                this.subnet_custom.show();
241 126a01f2 Kostas Papadimitriou
            } else {
242 126a01f2 Kostas Papadimitriou
                this.subnet_custom.hide();
243 126a01f2 Kostas Papadimitriou
            }
244 126a01f2 Kostas Papadimitriou
        },
245 126a01f2 Kostas Papadimitriou
246 8d08f18a Kostas Papadimitriou
        init_handlers: function() {
247 126a01f2 Kostas Papadimitriou
248 126a01f2 Kostas Papadimitriou
            this.dhcp_select.click(_.bind(function(e){
249 126a01f2 Kostas Papadimitriou
                this.check_dhcp_form();
250 126a01f2 Kostas Papadimitriou
            }, this));
251 126a01f2 Kostas Papadimitriou
252 126a01f2 Kostas Papadimitriou
            this.subnet_select.change(_.bind(function(e){
253 126a01f2 Kostas Papadimitriou
                this.check_dhcp_form();
254 126a01f2 Kostas Papadimitriou
                if (this.subnet_custom.is(":visible")) {
255 126a01f2 Kostas Papadimitriou
                    this.subnet_custom.focus();
256 126a01f2 Kostas Papadimitriou
                }
257 126a01f2 Kostas Papadimitriou
            }, this));
258 126a01f2 Kostas Papadimitriou
259 8d08f18a Kostas Papadimitriou
            this.create_button.click(_.bind(function(e){
260 8d08f18a Kostas Papadimitriou
                this.submit();
261 8d08f18a Kostas Papadimitriou
            }, this));
262 8d08f18a Kostas Papadimitriou
263 8d08f18a Kostas Papadimitriou
            this.form.submit(_.bind(function(e){
264 8d08f18a Kostas Papadimitriou
                e.preventDefault();
265 8d08f18a Kostas Papadimitriou
                this.submit;
266 8d08f18a Kostas Papadimitriou
                return false;
267 8d08f18a Kostas Papadimitriou
            }, this))
268 8d08f18a Kostas Papadimitriou
269 8d08f18a Kostas Papadimitriou
            this.text.keypress(_.bind(function(e){
270 8d08f18a Kostas Papadimitriou
                if (e.which == 13) {this.submit()};
271 8d08f18a Kostas Papadimitriou
            },this))
272 8d08f18a Kostas Papadimitriou
        },
273 8d08f18a Kostas Papadimitriou
274 8d08f18a Kostas Papadimitriou
        submit: function() {
275 8d08f18a Kostas Papadimitriou
            if (this.validate()) {
276 8d08f18a Kostas Papadimitriou
                this.create();
277 8d08f18a Kostas Papadimitriou
            };
278 8d08f18a Kostas Papadimitriou
        },
279 8d08f18a Kostas Papadimitriou
        
280 8d08f18a Kostas Papadimitriou
        validate: function() {
281 8d08f18a Kostas Papadimitriou
            // sanitazie
282 8d08f18a Kostas Papadimitriou
            var t = this.text.val();
283 8d08f18a Kostas Papadimitriou
            t = t.replace(/^\s+|\s+$/g,"");
284 8d08f18a Kostas Papadimitriou
            this.text.val(t);
285 8d08f18a Kostas Papadimitriou
286 8d08f18a Kostas Papadimitriou
            if (this.text.val() == "") {
287 8d08f18a Kostas Papadimitriou
                this.text.closest(".form-field").addClass("error");
288 8d08f18a Kostas Papadimitriou
                this.text.focus();
289 8d08f18a Kostas Papadimitriou
                return false;
290 8d08f18a Kostas Papadimitriou
            } else {
291 126a01f2 Kostas Papadimitriou
                this.text.closest(".form-field").removeClass("error");
292 8d08f18a Kostas Papadimitriou
            }
293 126a01f2 Kostas Papadimitriou
            
294 126a01f2 Kostas Papadimitriou
            if (this.dhcp_select.is(":checked")) {
295 126a01f2 Kostas Papadimitriou
                if (this.subnet_select.val() == "custom") {
296 126a01f2 Kostas Papadimitriou
                    var sub = this.subnet_custom.val();
297 126a01f2 Kostas Papadimitriou
                    sub = sub.replace(/^\s+|\s+$/g,"");
298 126a01f2 Kostas Papadimitriou
                    this.subnet_custom.val(sub);
299 126a01f2 Kostas Papadimitriou
                        
300 126a01f2 Kostas Papadimitriou
                    if (!synnefo.util.IP_REGEX.exec(this.subnet_custom.val())) {
301 126a01f2 Kostas Papadimitriou
                        this.subnet_custom.closest(".form-field").prev().addClass("error");
302 126a01f2 Kostas Papadimitriou
                        return false;
303 126a01f2 Kostas Papadimitriou
                    } else {
304 126a01f2 Kostas Papadimitriou
                        this.subnet_custom.closest(".form-field").prev().removeClass("error");
305 126a01f2 Kostas Papadimitriou
                    }
306 126a01f2 Kostas Papadimitriou
                };
307 126a01f2 Kostas Papadimitriou
            }
308 126a01f2 Kostas Papadimitriou
309 126a01f2 Kostas Papadimitriou
            return true;
310 8d08f18a Kostas Papadimitriou
        },
311 8d08f18a Kostas Papadimitriou
312 8d08f18a Kostas Papadimitriou
        create: function() {
313 8d08f18a Kostas Papadimitriou
            this.create_button.addClass("in-progress");
314 126a01f2 Kostas Papadimitriou
315 126a01f2 Kostas Papadimitriou
            var name = this.text.val();
316 126a01f2 Kostas Papadimitriou
            var dhcp = this.dhcp_select.is(":checked");
317 126a01f2 Kostas Papadimitriou
            var subnet = null;
318 126a01f2 Kostas Papadimitriou
            var type = this.type_select.val();
319 126a01f2 Kostas Papadimitriou
320 126a01f2 Kostas Papadimitriou
            if (this.disable_network_type) { type = null };
321 126a01f2 Kostas Papadimitriou
322 126a01f2 Kostas Papadimitriou
            if (dhcp) {
323 126a01f2 Kostas Papadimitriou
                if (this.subnet_select.val() == "custom") {
324 126a01f2 Kostas Papadimitriou
                    subnet = this.subnet_custom.val();
325 126a01f2 Kostas Papadimitriou
                } else if (this.subnet_select.val() == "auto") {
326 126a01f2 Kostas Papadimitriou
                    subnet = null;
327 126a01f2 Kostas Papadimitriou
                } else {
328 126a01f2 Kostas Papadimitriou
                    subnet = this.subnet_select.val();
329 126a01f2 Kostas Papadimitriou
                }
330 126a01f2 Kostas Papadimitriou
                
331 126a01f2 Kostas Papadimitriou
            }
332 126a01f2 Kostas Papadimitriou
333 126a01f2 Kostas Papadimitriou
            snf.storage.networks.create(name, type, subnet, dhcp, _.bind(function(){
334 8d08f18a Kostas Papadimitriou
                this.hide();
335 8d08f18a Kostas Papadimitriou
            }, this));
336 8d08f18a Kostas Papadimitriou
        },
337 8d08f18a Kostas Papadimitriou
338 8d08f18a Kostas Papadimitriou
        beforeOpen: function() {
339 8d08f18a Kostas Papadimitriou
            this.create_button.removeClass("in-progress")
340 95072bf0 Kostas Papadimitriou
            this.text.closest(".form-field").removeClass("error");
341 8d08f18a Kostas Papadimitriou
            this.text.val("");
342 8d08f18a Kostas Papadimitriou
            this.text.show();
343 8d08f18a Kostas Papadimitriou
            this.text.focus();
344 126a01f2 Kostas Papadimitriou
            this.subnet_custom.val("");
345 126a01f2 Kostas Papadimitriou
            this.subnet_select.val("auto");
346 126a01f2 Kostas Papadimitriou
            this.dhcp_select.attr("checked", true);
347 126a01f2 Kostas Papadimitriou
            this.type_select.val(_.keys(synnefo.config.network_available_types)[0]);
348 126a01f2 Kostas Papadimitriou
            this.check_dhcp_form();
349 8d08f18a Kostas Papadimitriou
        },
350 8d08f18a Kostas Papadimitriou
351 8d08f18a Kostas Papadimitriou
        onOpen: function() {
352 8d08f18a Kostas Papadimitriou
            this.text.focus();
353 8d08f18a Kostas Papadimitriou
        }
354 8d08f18a Kostas Papadimitriou
    });
355 8d08f18a Kostas Papadimitriou
356 126a01f2 Kostas Papadimitriou
    views.NetworkNICView = views.View.extend({
357 8d08f18a Kostas Papadimitriou
358 126a01f2 Kostas Papadimitriou
        initialize: function(nic, parent, firewall_controls, el) {
359 8d08f18a Kostas Papadimitriou
            this.firewall_controls = firewall_controls || false;
360 126a01f2 Kostas Papadimitriou
            this.nic = nic;
361 126a01f2 Kostas Papadimitriou
            this.vm = nic.get_vm();
362 8d08f18a Kostas Papadimitriou
            // parent view di
363 8d08f18a Kostas Papadimitriou
            this.parent = parent;
364 8d08f18a Kostas Papadimitriou
            // TODO make it better
365 126a01f2 Kostas Papadimitriou
            this.el = el || this.parent.get_nic_view(nic);
366 8d08f18a Kostas Papadimitriou
367 8d08f18a Kostas Papadimitriou
            this.init_layout();
368 8d08f18a Kostas Papadimitriou
            this.update_layout();
369 8d08f18a Kostas Papadimitriou
370 8d08f18a Kostas Papadimitriou
            this.disconnect = this.$(".action-disconnect");
371 8d08f18a Kostas Papadimitriou
            this.confirm_el = this.$(".confirm_single");
372 8d08f18a Kostas Papadimitriou
            this.cancel = this.$("button.no");
373 8d08f18a Kostas Papadimitriou
            this.confirm = this.$("button.yes");
374 8d08f18a Kostas Papadimitriou
            this.details = this.$(".action-details");
375 9b059b7e Kostas Papadimitriou
            this.vm_connect = this.$(".machine-connect");
376 8d08f18a Kostas Papadimitriou
377 8d08f18a Kostas Papadimitriou
            this.init_handlers();
378 9b059b7e Kostas Papadimitriou
            this.connect_overlay = new views.VMConnectView();
379 8d08f18a Kostas Papadimitriou
            
380 8d08f18a Kostas Papadimitriou
            this.firewall_view = undefined;
381 8d08f18a Kostas Papadimitriou
            if (this.firewall_controls) {
382 126a01f2 Kostas Papadimitriou
                this.firewall_view = new views.FirewallEditView(this.nic, this.parent.network, this);
383 8d08f18a Kostas Papadimitriou
            }
384 8d08f18a Kostas Papadimitriou
385 8d08f18a Kostas Papadimitriou
        },
386 8d08f18a Kostas Papadimitriou
        
387 126a01f2 Kostas Papadimitriou
        reset_all_net_actions: function(act_types) {
388 126a01f2 Kostas Papadimitriou
            synnefo.storage.networks.each(function(n){
389 126a01f2 Kostas Papadimitriou
                var actions = n.get('actions');
390 126a01f2 Kostas Papadimitriou
                _.each(act_types, function(type){
391 126a01f2 Kostas Papadimitriou
                    actions.remove_all(type);
392 126a01f2 Kostas Papadimitriou
                })
393 126a01f2 Kostas Papadimitriou
            })
394 126a01f2 Kostas Papadimitriou
        },
395 126a01f2 Kostas Papadimitriou
396 8d08f18a Kostas Papadimitriou
        init_handlers: function() {
397 8d08f18a Kostas Papadimitriou
            if (!this.parent.network.is_public()) {
398 8d08f18a Kostas Papadimitriou
                this.disconnect.click(_.bind(function(e){
399 8d08f18a Kostas Papadimitriou
                    e.preventDefault();
400 126a01f2 Kostas Papadimitriou
                    this.reset_all_net_actions(['destroy','disconnect']);
401 126a01f2 Kostas Papadimitriou
                    this.parent.network.get("actions").remove_all("disconnect");
402 126a01f2 Kostas Papadimitriou
                    this.parent.network.get("actions").add("disconnect", this.nic.id);
403 101e6604 Kostas Papadimitriou
                    this.parent.network.get("actions").remove("destroy");
404 8d08f18a Kostas Papadimitriou
                }, this));
405 8d08f18a Kostas Papadimitriou
                this.cancel.click(_.bind(function(e){
406 126a01f2 Kostas Papadimitriou
                    this.parent.network.get("actions").remove("disconnect", this.nic.id);
407 8d08f18a Kostas Papadimitriou
                    e.preventDefault()
408 8d08f18a Kostas Papadimitriou
                }, this));
409 126a01f2 Kostas Papadimitriou
410 8d08f18a Kostas Papadimitriou
                this.confirm.click(_.bind(function(e){
411 8d08f18a Kostas Papadimitriou
                    e.preventDefault()
412 126a01f2 Kostas Papadimitriou
                    this.disconnect_nic();
413 8d08f18a Kostas Papadimitriou
                    this.confirm_el.hide();
414 8d08f18a Kostas Papadimitriou
                    this.disconnect.removeClass("selected");
415 8d08f18a Kostas Papadimitriou
                }, this));
416 8d08f18a Kostas Papadimitriou
417 8d08f18a Kostas Papadimitriou
                snf.ui.main.bind("view:change", _.bind(function(v) {
418 8d08f18a Kostas Papadimitriou
                    if (v == "networks" ){ return }
419 8d08f18a Kostas Papadimitriou
                    this.confirm_el.hide();
420 8d08f18a Kostas Papadimitriou
                    this.disconnect.removeClass("selected");
421 8d08f18a Kostas Papadimitriou
                }, this));
422 8d08f18a Kostas Papadimitriou
423 8d08f18a Kostas Papadimitriou
                this.$(".remove-icon").click(_.bind(function(){
424 126a01f2 Kostas Papadimitriou
                    this.reset_all_net_actions(['destroy','disconnect']);
425 126a01f2 Kostas Papadimitriou
                    this.parent.network.get("actions").remove_all("disconnect");
426 126a01f2 Kostas Papadimitriou
                    this.parent.network.get("actions").add("disconnect", this.nic.id);
427 101e6604 Kostas Papadimitriou
                    this.parent.network.get("actions").remove("destroy");
428 9b059b7e Kostas Papadimitriou
                }, this));
429 9b059b7e Kostas Papadimitriou
430 9b059b7e Kostas Papadimitriou
                this.vm_connect.click(_.bind(function() {
431 9b059b7e Kostas Papadimitriou
                    this.connect_overlay.show(this.vm);
432 9b059b7e Kostas Papadimitriou
                }, this));
433 101e6604 Kostas Papadimitriou
                
434 101e6604 Kostas Papadimitriou
                this.parent.network.bind("change:actions", _.bind(function(model, action){
435 126a01f2 Kostas Papadimitriou
                    if (this.parent.network.get("actions").contains("disconnect", this.nic.id)) {
436 101e6604 Kostas Papadimitriou
                        this.confirm_disconnect();
437 101e6604 Kostas Papadimitriou
                    } else {
438 101e6604 Kostas Papadimitriou
                        this.cancel_disconnect();
439 101e6604 Kostas Papadimitriou
                    }
440 101e6604 Kostas Papadimitriou
                }, this));
441 8d08f18a Kostas Papadimitriou
            }
442 8d08f18a Kostas Papadimitriou
            
443 8d08f18a Kostas Papadimitriou
            var vm = this.vm;
444 126a01f2 Kostas Papadimitriou
            this.details.click(function(e){
445 126a01f2 Kostas Papadimitriou
                e.preventDefault();
446 8d08f18a Kostas Papadimitriou
                snf.ui.main.show_vm_details(vm);
447 101e6604 Kostas Papadimitriou
            });
448 101e6604 Kostas Papadimitriou
449 101e6604 Kostas Papadimitriou
        },
450 8d08f18a Kostas Papadimitriou
451 101e6604 Kostas Papadimitriou
        cancel_disconnect: function() {
452 101e6604 Kostas Papadimitriou
            this.confirm_el.hide();
453 101e6604 Kostas Papadimitriou
            this.disconnect.removeClass("selected");
454 101e6604 Kostas Papadimitriou
            this.$(".net-vm-actions a").removeClass("visible");
455 8d08f18a Kostas Papadimitriou
        },
456 8d08f18a Kostas Papadimitriou
457 8d08f18a Kostas Papadimitriou
        confirm_disconnect: function() {
458 8d08f18a Kostas Papadimitriou
            this.confirm_el.show();
459 8d08f18a Kostas Papadimitriou
            this.disconnect.addClass("selected");
460 101e6604 Kostas Papadimitriou
            this.$(".net-vm-actions a").addClass("visible");
461 8d08f18a Kostas Papadimitriou
        },
462 8d08f18a Kostas Papadimitriou
463 8d08f18a Kostas Papadimitriou
        init_layout: function() {
464 8d08f18a Kostas Papadimitriou
            if (!this.firewall_controls) { return };
465 8d08f18a Kostas Papadimitriou
        },
466 8d08f18a Kostas Papadimitriou
467 8d08f18a Kostas Papadimitriou
        update_layout: function() {
468 8d08f18a Kostas Papadimitriou
            this.$(".vm-name").text(snf.util.truncate(this.vm.get("name"), 40));
469 8d08f18a Kostas Papadimitriou
            this.$("img.logo").attr("src", ui.helpers.vm_icon_path(this.vm, "medium"));
470 8d08f18a Kostas Papadimitriou
471 8d08f18a Kostas Papadimitriou
            if (this.firewall_view) {
472 126a01f2 Kostas Papadimitriou
                this.$(".ipv4-text").text(this.nic.get_v4_address());
473 126a01f2 Kostas Papadimitriou
                this.$(".ipv6-text").text(this.nic.get_v6_address());
474 8d08f18a Kostas Papadimitriou
            }
475 8d08f18a Kostas Papadimitriou
476 8d08f18a Kostas Papadimitriou
            if (this.firewall_view) {
477 8d08f18a Kostas Papadimitriou
                this.firewall_view.update_layout();
478 8d08f18a Kostas Papadimitriou
            }
479 126a01f2 Kostas Papadimitriou
480 126a01f2 Kostas Papadimitriou
            if (!this.firewall_view) {
481 126a01f2 Kostas Papadimitriou
                this.$(".ip4-container").hide();
482 126a01f2 Kostas Papadimitriou
                this.$(".ip6-container").hide();
483 126a01f2 Kostas Papadimitriou
                
484 126a01f2 Kostas Papadimitriou
                if (this.nic.get("ipv4")) {
485 126a01f2 Kostas Papadimitriou
                    this.$(".ipv4-text").text(this.nic.get_v4_address());
486 126a01f2 Kostas Papadimitriou
                    this.$(".ip4-container").show();
487 126a01f2 Kostas Papadimitriou
                    this.$(".machine-connect .content").hide();
488 126a01f2 Kostas Papadimitriou
                } else if (this.nic.get("ipv6")) {
489 126a01f2 Kostas Papadimitriou
                    this.$(".ipv6-text").text(this.nic.get_v6_address());
490 126a01f2 Kostas Papadimitriou
                    this.$(".ip6-container").show();
491 126a01f2 Kostas Papadimitriou
                    this.$(".machine-connect .content").hide();
492 126a01f2 Kostas Papadimitriou
                } else {
493 126a01f2 Kostas Papadimitriou
                    this.$(".machine-connect .content").show();
494 126a01f2 Kostas Papadimitriou
                }
495 126a01f2 Kostas Papadimitriou
            } else {
496 126a01f2 Kostas Papadimitriou
            }
497 8d08f18a Kostas Papadimitriou
        },
498 8d08f18a Kostas Papadimitriou
499 126a01f2 Kostas Papadimitriou
        disconnect_nic: function() {
500 8d08f18a Kostas Papadimitriou
            this.$("a.selected").removeClass("selected");
501 9555268a Kostas Papadimitriou
            this.nic.get_network().remove_nic(this.nic);
502 8d08f18a Kostas Papadimitriou
        },
503 8d08f18a Kostas Papadimitriou
    })
504 8d08f18a Kostas Papadimitriou
505 8d08f18a Kostas Papadimitriou
    views.NetworkModelRenameView = views.View.extend({
506 8d08f18a Kostas Papadimitriou
        initialize: function(parent, network) {
507 8d08f18a Kostas Papadimitriou
            this.parent = parent;
508 8d08f18a Kostas Papadimitriou
            this.network = network;
509 8d08f18a Kostas Papadimitriou
            this.el = this.parent.el.find(".name-div");
510 8d08f18a Kostas Papadimitriou
511 8d08f18a Kostas Papadimitriou
            this.icon = this.$(".rename-network");
512 8d08f18a Kostas Papadimitriou
            this.save = this.$("span.save");
513 8d08f18a Kostas Papadimitriou
            this.cancel = this.$("span.cancel");
514 8d08f18a Kostas Papadimitriou
            this.buttons = this.$(".editbuttons");
515 8d08f18a Kostas Papadimitriou
            this.name = this.$("span.name");
516 8d08f18a Kostas Papadimitriou
            this.editing = false;
517 8d08f18a Kostas Papadimitriou
            this.init_handlers();
518 8d08f18a Kostas Papadimitriou
            this.update_layout();
519 8d08f18a Kostas Papadimitriou
        },
520 8d08f18a Kostas Papadimitriou
521 8d08f18a Kostas Papadimitriou
        init_handlers: function() {
522 8d08f18a Kostas Papadimitriou
            this.icon.click(_.bind(function(){
523 8d08f18a Kostas Papadimitriou
                this.editing = true;
524 8d08f18a Kostas Papadimitriou
                this.update_layout();
525 8d08f18a Kostas Papadimitriou
            }, this));
526 8d08f18a Kostas Papadimitriou
            this.cancel.click(_.bind(function(){
527 8d08f18a Kostas Papadimitriou
                this.editing = false;
528 8d08f18a Kostas Papadimitriou
                this.update_layout();
529 8d08f18a Kostas Papadimitriou
            }, this));
530 8d08f18a Kostas Papadimitriou
            this.save.click(_.bind(function(){
531 8d08f18a Kostas Papadimitriou
                this.submit();
532 8d08f18a Kostas Papadimitriou
            }, this))
533 8d08f18a Kostas Papadimitriou
        },
534 8d08f18a Kostas Papadimitriou
        
535 8d08f18a Kostas Papadimitriou
        submit: function() {
536 8d08f18a Kostas Papadimitriou
            var value = _(this.input.val()).trim();
537 8d08f18a Kostas Papadimitriou
            if (value == "") { return }
538 8d08f18a Kostas Papadimitriou
539 8d08f18a Kostas Papadimitriou
            this.network.rename(value, _.bind(function(){
540 8d08f18a Kostas Papadimitriou
                this.editing = false;
541 8d08f18a Kostas Papadimitriou
                this.update_layout();
542 8d08f18a Kostas Papadimitriou
            }, this));
543 8d08f18a Kostas Papadimitriou
        },
544 8d08f18a Kostas Papadimitriou
545 8d08f18a Kostas Papadimitriou
        create_input: function() {
546 8d08f18a Kostas Papadimitriou
            this.input = $('<input type="text" class="network-rename-input" />');
547 8d08f18a Kostas Papadimitriou
            this.input.val(this.network.get("name"));
548 8d08f18a Kostas Papadimitriou
            this.el.append(this.input);
549 8d08f18a Kostas Papadimitriou
            this.input.focus();
550 5939efeb Kostas Papadimitriou
            this.input.bind("keydown", _.bind(function(ev){
551 5939efeb Kostas Papadimitriou
                ev.keyCode = ev.keyCode || ev.which;
552 5939efeb Kostas Papadimitriou
                if (ev.keyCode == 13) { this.submit(); };
553 5939efeb Kostas Papadimitriou
                if (ev.keyCode == 27) {this.editing = false; this.update_layout()};
554 8d08f18a Kostas Papadimitriou
            }, this));
555 8d08f18a Kostas Papadimitriou
        },
556 8d08f18a Kostas Papadimitriou
557 8d08f18a Kostas Papadimitriou
        remove_input: function() {
558 8d08f18a Kostas Papadimitriou
            if (!this.input) { return }
559 8d08f18a Kostas Papadimitriou
            this.input.remove();
560 8d08f18a Kostas Papadimitriou
        },
561 8d08f18a Kostas Papadimitriou
562 8d08f18a Kostas Papadimitriou
        update_layout: function() {
563 8d08f18a Kostas Papadimitriou
            if (this.editing) {
564 8d08f18a Kostas Papadimitriou
                if (this.buttons.is(":visible")) { return }
565 8d08f18a Kostas Papadimitriou
                this.icon.hide();
566 8d08f18a Kostas Papadimitriou
                this.buttons.show();
567 8d08f18a Kostas Papadimitriou
                this.create_input();
568 8d08f18a Kostas Papadimitriou
                this.name.hide();
569 8d08f18a Kostas Papadimitriou
            } else {
570 8d08f18a Kostas Papadimitriou
                this.buttons.hide();
571 8d08f18a Kostas Papadimitriou
                this.remove_input();
572 8d08f18a Kostas Papadimitriou
                this.name.show();
573 8d08f18a Kostas Papadimitriou
                this.icon.show();
574 8d08f18a Kostas Papadimitriou
            }
575 8d08f18a Kostas Papadimitriou
        }
576 8d08f18a Kostas Papadimitriou
    })
577 8d08f18a Kostas Papadimitriou
578 8d08f18a Kostas Papadimitriou
    views.FirewallEditView = views.View.extend({
579 126a01f2 Kostas Papadimitriou
        initialize: function(nic, network, parent) {
580 8d08f18a Kostas Papadimitriou
            this.parent = parent;
581 126a01f2 Kostas Papadimitriou
            this.vm = nic.get_vm();
582 126a01f2 Kostas Papadimitriou
            this.nic = nic;
583 8d08f18a Kostas Papadimitriou
            this.network = network;
584 8d08f18a Kostas Papadimitriou
            this.el = this.parent.el;
585 8d08f18a Kostas Papadimitriou
586 8d08f18a Kostas Papadimitriou
            views.FirewallEditView.__super__.initialize.apply(this);
587 8d08f18a Kostas Papadimitriou
588 8d08f18a Kostas Papadimitriou
            // elements
589 8d08f18a Kostas Papadimitriou
            this.toggler = this.$(".firewall-toggle");
590 8d08f18a Kostas Papadimitriou
            this.indicator = this.$(".machines-label span");
591 8d08f18a Kostas Papadimitriou
            this.progress = this.$(".network-progress-indicator");
592 8d08f18a Kostas Papadimitriou
            this.content = this.$(".firewall-content");
593 8d08f18a Kostas Papadimitriou
            this.inputs = this.$("input[type=radio]");
594 8d08f18a Kostas Papadimitriou
            this.labels = this.$("span.checkbox-legends, label.checkbox-legends");
595 8d08f18a Kostas Papadimitriou
            this.apply = this.$(".firewall-apply");
596 8d08f18a Kostas Papadimitriou
597 8d08f18a Kostas Papadimitriou
            this.$(".firewall-content").hide();
598 8d08f18a Kostas Papadimitriou
            this.$(".firewall-content input[type=radio]").attr("name", "firewall-opt-for-{0}".format(this.vm.id))
599 126a01f2 Kostas Papadimitriou
            var mode = this.vm.get_firewall_profile();
600 8d08f18a Kostas Papadimitriou
            this.$(".firewall-content input[value={0}]".format(mode)).attr("checked", true);
601 8d08f18a Kostas Papadimitriou
602 8d08f18a Kostas Papadimitriou
            this.init_handlers();
603 8d08f18a Kostas Papadimitriou
            this.update_layout();
604 126a01f2 Kostas Papadimitriou
605 126a01f2 Kostas Papadimitriou
            var self = this;
606 126a01f2 Kostas Papadimitriou
            this.nic.bind("change:pending_firewall_sending", function(nic, value) {
607 126a01f2 Kostas Papadimitriou
                if (value) {
608 126a01f2 Kostas Papadimitriou
                    self.apply.addClass("in-progress");       
609 126a01f2 Kostas Papadimitriou
                    self.progress.show();
610 126a01f2 Kostas Papadimitriou
                } else {
611 126a01f2 Kostas Papadimitriou
                    self.apply.removeClass("in-progress");       
612 126a01f2 Kostas Papadimitriou
                    self.progress.hide();
613 126a01f2 Kostas Papadimitriou
                    self.toggler.click();
614 126a01f2 Kostas Papadimitriou
                }
615 126a01f2 Kostas Papadimitriou
            });
616 126a01f2 Kostas Papadimitriou
617 126a01f2 Kostas Papadimitriou
            this.nic.bind("change:firewallProfile", function(nic){
618 126a01f2 Kostas Papadimitriou
                self.update_layout();
619 126a01f2 Kostas Papadimitriou
                self.reset_value();
620 126a01f2 Kostas Papadimitriou
            })
621 126a01f2 Kostas Papadimitriou
622 8d08f18a Kostas Papadimitriou
        },
623 8d08f18a Kostas Papadimitriou
        
624 8d08f18a Kostas Papadimitriou
        _get_selected: function() {
625 8d08f18a Kostas Papadimitriou
            return this.inputs.filter(":checked");
626 8d08f18a Kostas Papadimitriou
        },
627 8d08f18a Kostas Papadimitriou
628 8d08f18a Kostas Papadimitriou
        reset_selected: function() {
629 8d08f18a Kostas Papadimitriou
        },
630 8d08f18a Kostas Papadimitriou
631 8d08f18a Kostas Papadimitriou
        submit: function() {
632 8d08f18a Kostas Papadimitriou
        },
633 8d08f18a Kostas Papadimitriou
634 8d08f18a Kostas Papadimitriou
        reset_value: function() {
635 126a01f2 Kostas Papadimitriou
            this.inputs.filter("[value={0}]".format(
636 126a01f2 Kostas Papadimitriou
              this.nic.get('firewallProfile'))).attr("checked", true);
637 8d08f18a Kostas Papadimitriou
        },
638 8d08f18a Kostas Papadimitriou
639 8d08f18a Kostas Papadimitriou
        init_handlers: function() {
640 8d08f18a Kostas Papadimitriou
            this.toggler.click(_.bind(function(){
641 8d08f18a Kostas Papadimitriou
                cont = this.content;
642 8d08f18a Kostas Papadimitriou
                if (cont.is(":visible")) {
643 8d08f18a Kostas Papadimitriou
                    this.hide_firewall();
644 8d08f18a Kostas Papadimitriou
                    this.reset_value();
645 8d08f18a Kostas Papadimitriou
                } else {
646 8d08f18a Kostas Papadimitriou
                    this.show_firewall();
647 8d08f18a Kostas Papadimitriou
                }
648 8d08f18a Kostas Papadimitriou
649 8d08f18a Kostas Papadimitriou
                $(window).trigger("resize");
650 8d08f18a Kostas Papadimitriou
            }, this))
651 9ce969a7 Kostas Papadimitriou
            
652 8d08f18a Kostas Papadimitriou
            this.apply.click(_.bind(function(){
653 126a01f2 Kostas Papadimitriou
                this.nic.set_firewall(this.value());
654 8d08f18a Kostas Papadimitriou
            }, this))
655 8d08f18a Kostas Papadimitriou
656 8d08f18a Kostas Papadimitriou
            this.inputs.change(_.bind(function(){
657 8d08f18a Kostas Papadimitriou
                this.update_selected();
658 8d08f18a Kostas Papadimitriou
            }, this))
659 8d08f18a Kostas Papadimitriou
            
660 8d08f18a Kostas Papadimitriou
            var self = this;
661 8d08f18a Kostas Papadimitriou
            this.$(".checkbox-legends").click(function(el) {
662 8d08f18a Kostas Papadimitriou
                var el = $(this);
663 8d08f18a Kostas Papadimitriou
                el.prev().click();
664 8d08f18a Kostas Papadimitriou
                self.update_selected();
665 8d08f18a Kostas Papadimitriou
            })
666 8d08f18a Kostas Papadimitriou
        },
667 8d08f18a Kostas Papadimitriou
668 8d08f18a Kostas Papadimitriou
        update_selected: function() {
669 8d08f18a Kostas Papadimitriou
            this.update_layout();
670 8d08f18a Kostas Papadimitriou
        },
671 8d08f18a Kostas Papadimitriou
672 8d08f18a Kostas Papadimitriou
        show_firewall: function() {
673 8d08f18a Kostas Papadimitriou
            this.content.slideDown(100, function(){$(window).trigger("resize")});
674 8d08f18a Kostas Papadimitriou
            this.toggler.addClass("open");
675 8d08f18a Kostas Papadimitriou
        },
676 8d08f18a Kostas Papadimitriou
677 8d08f18a Kostas Papadimitriou
        hide_firewall: function() {
678 8d08f18a Kostas Papadimitriou
            this.content.slideUp(100, function(){$(window).trigger("resize")});
679 8d08f18a Kostas Papadimitriou
            this.toggler.removeClass("open");
680 8d08f18a Kostas Papadimitriou
        },
681 8d08f18a Kostas Papadimitriou
682 8d08f18a Kostas Papadimitriou
        value: function() {
683 8d08f18a Kostas Papadimitriou
            return this._get_selected().val();
684 8d08f18a Kostas Papadimitriou
        },
685 8d08f18a Kostas Papadimitriou
686 8d08f18a Kostas Papadimitriou
        update_layout: function() {
687 126a01f2 Kostas Papadimitriou
            if (this.value() == this.vm.get_firewall_profile()) {
688 8d08f18a Kostas Papadimitriou
                this.apply.hide();
689 8d08f18a Kostas Papadimitriou
            } else {
690 8d08f18a Kostas Papadimitriou
                this.apply.show();
691 8d08f18a Kostas Papadimitriou
            }
692 8d08f18a Kostas Papadimitriou
693 126a01f2 Kostas Papadimitriou
            var profile = this.vm.get_firewall_profile();
694 8d08f18a Kostas Papadimitriou
            if (this.vm.has_firewall(this.network.id)) {
695 8d08f18a Kostas Papadimitriou
                this.$(".firewall-toggle .label span").text("On");
696 8d08f18a Kostas Papadimitriou
                this.$(".firewall-toggle .label span").removeClass("firewall-off");
697 8d08f18a Kostas Papadimitriou
                this.$(".firewall-toggle .label span").addClass("firewall-on");
698 8d08f18a Kostas Papadimitriou
            } else {
699 8d08f18a Kostas Papadimitriou
                this.$(".firewall-toggle .label span").text("Off");
700 8d08f18a Kostas Papadimitriou
                this.$(".firewall-toggle .label span").removeClass("firewall-on");
701 8d08f18a Kostas Papadimitriou
                this.$(".firewall-toggle .label span").addClass("firewall-off");
702 8d08f18a Kostas Papadimitriou
            }
703 8d08f18a Kostas Papadimitriou
            
704 8d08f18a Kostas Papadimitriou
            this.$("span.checkbox-legends").removeClass("current");
705 126a01f2 Kostas Papadimitriou
            this.inputs.filter("[value={0}]".format(profile)).next().addClass("current");
706 8d08f18a Kostas Papadimitriou
            
707 8d08f18a Kostas Papadimitriou
        }
708 8d08f18a Kostas Papadimitriou
    })
709 8d08f18a Kostas Papadimitriou
710 8d08f18a Kostas Papadimitriou
    views.NetworkModelView = views.View.extend({
711 8d08f18a Kostas Papadimitriou
        
712 8d08f18a Kostas Papadimitriou
        firewall: false,
713 8d08f18a Kostas Papadimitriou
714 8d08f18a Kostas Papadimitriou
        initialize: function(network, view) {
715 8d08f18a Kostas Papadimitriou
            this.parent_view = view;
716 8d08f18a Kostas Papadimitriou
            this.network = network;
717 9555268a Kostas Papadimitriou
            this.main_view_id = this.main_view_id ? this.main_view_id : "networks_view_" + network.id;
718 7b389cf5 Kostas Papadimitriou
            this.is_public = network.is_public();
719 7b389cf5 Kostas Papadimitriou
720 126a01f2 Kostas Papadimitriou
            this.init_nics_handlers();
721 9555268a Kostas Papadimitriou
            
722 7b389cf5 Kostas Papadimitriou
            this.view_id = "networks_view_" + network.id;
723 8d08f18a Kostas Papadimitriou
            views.NetworkModelView.__super__.initialize.call(this);
724 8d08f18a Kostas Papadimitriou
725 126a01f2 Kostas Papadimitriou
            this.nics_views = {};
726 8d08f18a Kostas Papadimitriou
727 8d08f18a Kostas Papadimitriou
            this.el = this.create_el();
728 8d08f18a Kostas Papadimitriou
729 8d08f18a Kostas Papadimitriou
            // element helpers
730 126a01f2 Kostas Papadimitriou
            this.nics_list = this.$(".machines-list");
731 126a01f2 Kostas Papadimitriou
            this.nics_list_toggler = this.$(".list-toggle");
732 8d08f18a Kostas Papadimitriou
            
733 8d08f18a Kostas Papadimitriou
            this.init_handlers();
734 9555268a Kostas Papadimitriou
            this.init_toggler_handlers();
735 126a01f2 Kostas Papadimitriou
            this.update_nics();
736 8d08f18a Kostas Papadimitriou
            this.update_layout();
737 8d08f18a Kostas Papadimitriou
738 126a01f2 Kostas Papadimitriou
            this.hide_nics_list();
739 126a01f2 Kostas Papadimitriou
            this.nics_list.hide();
740 8d08f18a Kostas Papadimitriou
741 8d08f18a Kostas Papadimitriou
            this.rename_view = undefined;
742 8d08f18a Kostas Papadimitriou
            if (!this.network.is_public()) {
743 126a01f2 Kostas Papadimitriou
                // allow network rename for non public networks only
744 8d08f18a Kostas Papadimitriou
                this.rename_view = new views.NetworkModelRenameView(this, network);
745 8d08f18a Kostas Papadimitriou
            }
746 126a01f2 Kostas Papadimitriou
            
747 126a01f2 Kostas Papadimitriou
            var self = this;
748 126a01f2 Kostas Papadimitriou
            this.network.bind('change:status', function() {
749 126a01f2 Kostas Papadimitriou
                self.update_layout();
750 9555268a Kostas Papadimitriou
            });
751 9555268a Kostas Papadimitriou
752 126a01f2 Kostas Papadimitriou
        },
753 126a01f2 Kostas Papadimitriou
754 126a01f2 Kostas Papadimitriou
        init_nics_handlers: function() {
755 126a01f2 Kostas Papadimitriou
            storage.nics.bind("add", _.bind(this.nic_added_handler, this, "add"));
756 126a01f2 Kostas Papadimitriou
            storage.nics.bind("change", _.bind(this.nic_changed_handler, this, "change"));
757 126a01f2 Kostas Papadimitriou
            storage.nics.bind("reset", _.bind(this.nic_changed_handler, this, "reset"));
758 126a01f2 Kostas Papadimitriou
            storage.nics.bind("remove", _.bind(this.nic_removed_handler, this, "remove"));
759 8d08f18a Kostas Papadimitriou
        },
760 8d08f18a Kostas Papadimitriou
761 126a01f2 Kostas Papadimitriou
762 126a01f2 Kostas Papadimitriou
        show_nics_list: function() {
763 126a01f2 Kostas Papadimitriou
            if (this.nics_empty()) { return }
764 126a01f2 Kostas Papadimitriou
            this.nics_list_toggler.addClass("open");
765 126a01f2 Kostas Papadimitriou
            this.nics_list.slideDown(function(){
766 8d08f18a Kostas Papadimitriou
                $(window).trigger("resize");
767 8d08f18a Kostas Papadimitriou
            }).closest(".network").addClass("expand");
768 8d08f18a Kostas Papadimitriou
            this.$(".empty-network-slot").show();
769 126a01f2 Kostas Papadimitriou
            this.nics_visible = true;
770 8d08f18a Kostas Papadimitriou
        },
771 8d08f18a Kostas Papadimitriou
772 126a01f2 Kostas Papadimitriou
        hide_nics_list: function() {
773 126a01f2 Kostas Papadimitriou
            this.nics_list_toggler.removeClass("open");
774 126a01f2 Kostas Papadimitriou
            this.nics_list.slideUp(function(){
775 8d08f18a Kostas Papadimitriou
                $(window).trigger("resize");
776 8d08f18a Kostas Papadimitriou
            }).closest(".network").removeClass("expand");
777 8d08f18a Kostas Papadimitriou
            this.$(".empty-network-slot").hide();
778 126a01f2 Kostas Papadimitriou
            this.nics_visible = false;
779 8d08f18a Kostas Papadimitriou
        },
780 6a5168a3 Kostas Papadimitriou
        
781 9555268a Kostas Papadimitriou
        init_toggler_handlers: function() {
782 126a01f2 Kostas Papadimitriou
            this.nics_list_toggler.click(_.bind(function(){
783 126a01f2 Kostas Papadimitriou
                if (this.nics_list.is(":visible")) {
784 126a01f2 Kostas Papadimitriou
                    this.hide_nics_list();
785 8d08f18a Kostas Papadimitriou
                } else {
786 6a5168a3 Kostas Papadimitriou
                    this.fix_left_border();
787 126a01f2 Kostas Papadimitriou
                    this.show_nics_list();
788 8d08f18a Kostas Papadimitriou
                }
789 8d08f18a Kostas Papadimitriou
790 126a01f2 Kostas Papadimitriou
                this.check_empty_nics();
791 8d08f18a Kostas Papadimitriou
            }, this));
792 9555268a Kostas Papadimitriou
        },
793 9555268a Kostas Papadimitriou
794 9555268a Kostas Papadimitriou
        init_handlers: function() {
795 9555268a Kostas Papadimitriou
            var self = this;
796 9555268a Kostas Papadimitriou
797 8d08f18a Kostas Papadimitriou
798 8d08f18a Kostas Papadimitriou
            this.$(".action-add").click(_.bind(function(e){
799 8d08f18a Kostas Papadimitriou
                e.preventDefault();
800 101e6604 Kostas Papadimitriou
                this.network.get("actions").remove("destroy");
801 8d08f18a Kostas Papadimitriou
                this.show_connect_vms();
802 8d08f18a Kostas Papadimitriou
            }, this))
803 8d08f18a Kostas Papadimitriou
804 8d08f18a Kostas Papadimitriou
            this.$(".add-icon").click(_.bind(function(e){
805 8d08f18a Kostas Papadimitriou
                e.preventDefault();
806 8d08f18a Kostas Papadimitriou
                this.show_connect_vms();
807 8d08f18a Kostas Papadimitriou
            }, this))
808 8d08f18a Kostas Papadimitriou
809 8d08f18a Kostas Papadimitriou
            this.$(".net-actions .destroy a").click(_.bind(function(e){
810 8d08f18a Kostas Papadimitriou
                e.preventDefault();
811 126a01f2 Kostas Papadimitriou
                synnefo.storage.networks.each(function(n) {
812 126a01f2 Kostas Papadimitriou
                    n.get('actions').remove_all("disconnect");
813 126a01f2 Kostas Papadimitriou
                    if (!synnefo.config.network_allow_multiple_destory) {
814 126a01f2 Kostas Papadimitriou
                        n.get('actions').remove_all("destroy");
815 126a01f2 Kostas Papadimitriou
                    }
816 126a01f2 Kostas Papadimitriou
                });
817 101e6604 Kostas Papadimitriou
                self.network.get("actions").add("destroy");
818 101e6604 Kostas Papadimitriou
                self.network.get("actions").remove_all("disconnect");
819 8d08f18a Kostas Papadimitriou
            }, this));
820 8d08f18a Kostas Papadimitriou
821 101e6604 Kostas Papadimitriou
            self.network.bind("change:actions", _.bind(function(net, action) {
822 101e6604 Kostas Papadimitriou
                if (this.network.get("actions").contains("destroy")) {
823 101e6604 Kostas Papadimitriou
                    this.confirm_destroy();
824 101e6604 Kostas Papadimitriou
                } else {
825 101e6604 Kostas Papadimitriou
                    this.cancel_destroy();
826 101e6604 Kostas Papadimitriou
                }
827 4792afbe Kostas Papadimitriou
            }, this));
828 4792afbe Kostas Papadimitriou
            
829 4792afbe Kostas Papadimitriou
830 4792afbe Kostas Papadimitriou
            // reset pending destory action after successful removal
831 4792afbe Kostas Papadimitriou
            self.network.bind("remove", _.bind(function(net){
832 4792afbe Kostas Papadimitriou
                net.get("actions").remove_all("destroy");
833 4792afbe Kostas Papadimitriou
            }));
834 101e6604 Kostas Papadimitriou
835 8d08f18a Kostas Papadimitriou
            this.$(".net-actions button.no").click(function(e){
836 8d08f18a Kostas Papadimitriou
                e.preventDefault();
837 101e6604 Kostas Papadimitriou
                self.network.get("actions").remove("destroy");
838 8d08f18a Kostas Papadimitriou
            });
839 8d08f18a Kostas Papadimitriou
840 8d08f18a Kostas Papadimitriou
            this.$(".net-actions button.yes").click(function(e){
841 8d08f18a Kostas Papadimitriou
                e.preventDefault();
842 8d08f18a Kostas Papadimitriou
                var el = $(this);
843 8d08f18a Kostas Papadimitriou
                el.closest(".confirm_single").hide();
844 8d08f18a Kostas Papadimitriou
                el.parent().parent().find(".selected").removeClass("selected");
845 101e6604 Kostas Papadimitriou
                self.network.call('destroy', {}, function(){
846 8d08f18a Kostas Papadimitriou
                    el.closest(".confirm_single").removeClass("in-progress");
847 8d08f18a Kostas Papadimitriou
                });
848 8d08f18a Kostas Papadimitriou
                el.closest(".confirm_single").addClass("in-progress");
849 8d08f18a Kostas Papadimitriou
            });
850 8d08f18a Kostas Papadimitriou
851 8d08f18a Kostas Papadimitriou
            snf.ui.main.bind("view:change", _.bind(function(v) {
852 8d08f18a Kostas Papadimitriou
                if (v == "networks" ){ return }
853 8d08f18a Kostas Papadimitriou
                this.$(".confirm_single").hide();
854 8d08f18a Kostas Papadimitriou
                this.$("a.selected").removeClass("selected");
855 8d08f18a Kostas Papadimitriou
            }, this));
856 8c923194 Kostas Papadimitriou
857 8c923194 Kostas Papadimitriou
            $(window).bind("resize", _.bind(function() {
858 8c923194 Kostas Papadimitriou
                this.fix_left_border();
859 8c923194 Kostas Papadimitriou
            }, this));
860 8d08f18a Kostas Papadimitriou
        },
861 8d08f18a Kostas Papadimitriou
862 8d08f18a Kostas Papadimitriou
        show_connect_vms: function() {
863 8d08f18a Kostas Papadimitriou
            this.$(".confirm_single").hide();
864 8d08f18a Kostas Papadimitriou
            this.$("a.selected").removeClass("selected");
865 8d08f18a Kostas Papadimitriou
            var vms = this.network.get_connectable_vms();
866 8d08f18a Kostas Papadimitriou
            this.parent_view.connect_machines_view.show_vms(this.network,
867 8d08f18a Kostas Papadimitriou
                                                            vms, [], 
868 8d08f18a Kostas Papadimitriou
                                                            _.bind(this.connect_vms, this));
869 8d08f18a Kostas Papadimitriou
        },
870 8d08f18a Kostas Papadimitriou
871 101e6604 Kostas Papadimitriou
        cancel_destroy: function() {
872 101e6604 Kostas Papadimitriou
            this.$(".net-actions .destroy .confirm_single").hide();
873 101e6604 Kostas Papadimitriou
            this.$(".net-actions .destroy a.selected").removeClass("selected");
874 101e6604 Kostas Papadimitriou
            this.$(".net-actions a").removeClass("visible");
875 101e6604 Kostas Papadimitriou
        },
876 101e6604 Kostas Papadimitriou
877 8d08f18a Kostas Papadimitriou
        confirm_destroy: function() {
878 8d08f18a Kostas Papadimitriou
            this.$(".destroy .confirm_single").show();
879 8d08f18a Kostas Papadimitriou
            this.$(".destroy a").addClass("selected");
880 101e6604 Kostas Papadimitriou
            this.$(".net-actions a").addClass("visible");
881 8d08f18a Kostas Papadimitriou
        },
882 8d08f18a Kostas Papadimitriou
883 8d08f18a Kostas Papadimitriou
        connect_vms: function(vms) {
884 8d08f18a Kostas Papadimitriou
            _.each(vms, _.bind(function(vm){
885 8d08f18a Kostas Papadimitriou
                this.network.add_vm(vm);
886 8d08f18a Kostas Papadimitriou
            }, this));
887 8d08f18a Kostas Papadimitriou
888 8d08f18a Kostas Papadimitriou
            this.parent_view.connect_machines_view.hide();
889 8d08f18a Kostas Papadimitriou
        },
890 8d08f18a Kostas Papadimitriou
891 8d08f18a Kostas Papadimitriou
        create_el: function() {
892 9555268a Kostas Papadimitriou
            return this.$(this.tpl).clone().attr("id", this.main_view_id);
893 8d08f18a Kostas Papadimitriou
        },
894 8d08f18a Kostas Papadimitriou
895 126a01f2 Kostas Papadimitriou
        get_nic_id: function(nic) {
896 126a01f2 Kostas Papadimitriou
            return this.nic_id_tpl.format(nic.id);
897 8d08f18a Kostas Papadimitriou
        },
898 8d08f18a Kostas Papadimitriou
899 126a01f2 Kostas Papadimitriou
        get_nic_view: function(nic) {
900 126a01f2 Kostas Papadimitriou
            return $(this.get_nic_id(nic));
901 8d08f18a Kostas Papadimitriou
        },
902 9555268a Kostas Papadimitriou
        
903 9555268a Kostas Papadimitriou
        nic_in_network: function(nic) {
904 9555268a Kostas Papadimitriou
          return nic.get_network().id != this.network.id;
905 9555268a Kostas Papadimitriou
        },
906 8d08f18a Kostas Papadimitriou
907 126a01f2 Kostas Papadimitriou
        nic_added_handler: function(action, nic) {
908 9555268a Kostas Papadimitriou
            if (!this.nic_in_network(nic)) { return };
909 126a01f2 Kostas Papadimitriou
            this.add_or_update_nic(nic);
910 8d08f18a Kostas Papadimitriou
            this.update_layout();
911 6a5168a3 Kostas Papadimitriou
            this.fix_left_border();
912 8d08f18a Kostas Papadimitriou
        },
913 8d08f18a Kostas Papadimitriou
914 126a01f2 Kostas Papadimitriou
        nic_changed_handler: function(action, nics, model, changes) {
915 126a01f2 Kostas Papadimitriou
            var nics = nics || [];
916 126a01f2 Kostas Papadimitriou
917 126a01f2 Kostas Papadimitriou
            // reset or update
918 8d08f18a Kostas Papadimitriou
            if (action == "reset") {
919 126a01f2 Kostas Papadimitriou
                nics = nics;
920 8d08f18a Kostas Papadimitriou
            } else {
921 126a01f2 Kostas Papadimitriou
                if (!_.isArray(nics)) {
922 126a01f2 Kostas Papadimitriou
                    nics = [nics]
923 8d08f18a Kostas Papadimitriou
                }
924 8d08f18a Kostas Papadimitriou
            }
925 8d08f18a Kostas Papadimitriou
            
926 126a01f2 Kostas Papadimitriou
            _.each(nics, _.bind(function(nic) {
927 9555268a Kostas Papadimitriou
                if (!this.nic_in_network(nic)) { return };
928 126a01f2 Kostas Papadimitriou
                this.add_or_update_nic(nic);
929 8d08f18a Kostas Papadimitriou
            }, this));
930 126a01f2 Kostas Papadimitriou
931 8d08f18a Kostas Papadimitriou
            this.update_layout();
932 8d08f18a Kostas Papadimitriou
        },
933 8d08f18a Kostas Papadimitriou
934 126a01f2 Kostas Papadimitriou
        nic_removed_handler: function(action, nic, model) {
935 9555268a Kostas Papadimitriou
            if (!this.nic_in_network(nic)) { return };
936 6a5168a3 Kostas Papadimitriou
            this.fix_left_border();
937 126a01f2 Kostas Papadimitriou
            this.remove_nic(nic);
938 8d08f18a Kostas Papadimitriou
            this.update_layout();
939 8d08f18a Kostas Papadimitriou
        },
940 8d08f18a Kostas Papadimitriou
941 126a01f2 Kostas Papadimitriou
        remove_nic: function(nic) {
942 126a01f2 Kostas Papadimitriou
            var nic_view = this.get_nic_view(nic);
943 126a01f2 Kostas Papadimitriou
            if (nic_view.length) {
944 126a01f2 Kostas Papadimitriou
                nic_view.remove();
945 8d08f18a Kostas Papadimitriou
                try {
946 126a01f2 Kostas Papadimitriou
                    delete this.nics_views[nic.id]
947 8d08f18a Kostas Papadimitriou
                } catch (err) {
948 8d08f18a Kostas Papadimitriou
                }
949 8d08f18a Kostas Papadimitriou
            }
950 8d08f18a Kostas Papadimitriou
        },
951 8c923194 Kostas Papadimitriou
        
952 126a01f2 Kostas Papadimitriou
        create_nic_view: function(nic) {
953 126a01f2 Kostas Papadimitriou
            var nic_el = $(this.nic_tpl).clone().attr({
954 126a01f2 Kostas Papadimitriou
                id: this.get_nic_id(nic).replace("#","")
955 126a01f2 Kostas Papadimitriou
            });
956 126a01f2 Kostas Papadimitriou
            this.nics_list.append(nic_el);
957 126a01f2 Kostas Papadimitriou
            this.post_nic_add(nic);
958 8c923194 Kostas Papadimitriou
959 126a01f2 Kostas Papadimitriou
            if (!this.nics_views[nic.id]) {
960 126a01f2 Kostas Papadimitriou
                var nic_view = this.nics_views[nic.id] = new views.NetworkNICView(nic, this, this.firewall, nic_el);
961 8c923194 Kostas Papadimitriou
            }
962 8c923194 Kostas Papadimitriou
        },
963 8d08f18a Kostas Papadimitriou
964 126a01f2 Kostas Papadimitriou
        add_or_update_nic: function(nic) {
965 126a01f2 Kostas Papadimitriou
            if (!nic) { return };
966 126a01f2 Kostas Papadimitriou
                
967 126a01f2 Kostas Papadimitriou
            var nic_el = this.get_nic_view(nic);
968 126a01f2 Kostas Papadimitriou
            var nic_view = this.nics_views[nic.id];
969 8d08f18a Kostas Papadimitriou
970 126a01f2 Kostas Papadimitriou
            if (nic_el.length == 0) {
971 126a01f2 Kostas Papadimitriou
                nic_view = this.create_nic_view(nic);
972 8d08f18a Kostas Papadimitriou
            }
973 8d08f18a Kostas Papadimitriou
            
974 126a01f2 Kostas Papadimitriou
            if (nic_view) { nic_view.update_layout() };
975 8d08f18a Kostas Papadimitriou
976 126a01f2 Kostas Papadimitriou
            this.update_nic(nic);
977 126a01f2 Kostas Papadimitriou
            this.post_nic_update(nic);
978 8d08f18a Kostas Papadimitriou
        },
979 8d08f18a Kostas Papadimitriou
980 126a01f2 Kostas Papadimitriou
        update_nic: function(vm){},
981 126a01f2 Kostas Papadimitriou
        post_nic_add: function(vm){},
982 126a01f2 Kostas Papadimitriou
        post_nic_update: function(vm){},
983 9555268a Kostas Papadimitriou
        
984 9555268a Kostas Papadimitriou
        get_nics: function() {
985 9555268a Kostas Papadimitriou
          return this.network.get_nics();
986 9555268a Kostas Papadimitriou
        },
987 126a01f2 Kostas Papadimitriou
988 126a01f2 Kostas Papadimitriou
        update_nics: function(nics) {
989 9555268a Kostas Papadimitriou
            if (!nics) { nics = this.get_nics() };
990 126a01f2 Kostas Papadimitriou
            _.each(nics, _.bind(function(nic){
991 126a01f2 Kostas Papadimitriou
                this.add_or_update_nic(nic);
992 8d08f18a Kostas Papadimitriou
            }, this));
993 8d08f18a Kostas Papadimitriou
        },
994 8d08f18a Kostas Papadimitriou
995 126a01f2 Kostas Papadimitriou
        check_empty_nics: function() {
996 9555268a Kostas Papadimitriou
            if (this.get_nics().length == 0) {
997 126a01f2 Kostas Papadimitriou
                this.hide_nics_list();
998 8d08f18a Kostas Papadimitriou
            }
999 8d08f18a Kostas Papadimitriou
        },
1000 8d08f18a Kostas Papadimitriou
1001 126a01f2 Kostas Papadimitriou
        nics_empty: function() {
1002 9555268a Kostas Papadimitriou
            return this.get_nics().length == 0;
1003 8d08f18a Kostas Papadimitriou
        },
1004 8d08f18a Kostas Papadimitriou
1005 8d08f18a Kostas Papadimitriou
        remove: function() {
1006 8d08f18a Kostas Papadimitriou
            $(this.el).remove();
1007 8d08f18a Kostas Papadimitriou
        },
1008 8d08f18a Kostas Papadimitriou
1009 8d08f18a Kostas Papadimitriou
        update_layout: function() {
1010 8d08f18a Kostas Papadimitriou
            // has vms ???
1011 9555268a Kostas Papadimitriou
            this.check_empty_nics();
1012 8d08f18a Kostas Papadimitriou
1013 8d08f18a Kostas Papadimitriou
            // is expanded ???
1014 8d08f18a Kostas Papadimitriou
            //
1015 8d08f18a Kostas Papadimitriou
            // whats the network status ???
1016 8d08f18a Kostas Papadimitriou
            //
1017 9555268a Kostas Papadimitriou
            this.$(".machines-count").text(this.get_nics().length);
1018 8d08f18a Kostas Papadimitriou
1019 8d08f18a Kostas Papadimitriou
            var net_name = this.network.get("name");
1020 8d08f18a Kostas Papadimitriou
            if (net_name == "public") { net_name = "Internet" }
1021 8d08f18a Kostas Papadimitriou
            this.$(".name-div span.name").text(net_name);
1022 8d08f18a Kostas Papadimitriou
1023 8d08f18a Kostas Papadimitriou
            if (this.rename_view) {
1024 8d08f18a Kostas Papadimitriou
                this.rename_view.update_layout();
1025 8d08f18a Kostas Papadimitriou
            }
1026 8d08f18a Kostas Papadimitriou
            
1027 8d08f18a Kostas Papadimitriou
            this.$(".net-status").text(this.network.state_message());
1028 8d08f18a Kostas Papadimitriou
1029 8d08f18a Kostas Papadimitriou
            if (this.network.in_progress())  {
1030 8d08f18a Kostas Papadimitriou
                this.$(".spinner").show();
1031 8d08f18a Kostas Papadimitriou
                this.$(".network-indicator").addClass("in-progress");
1032 8d08f18a Kostas Papadimitriou
            } else {
1033 8d08f18a Kostas Papadimitriou
                this.$(".spinner").hide();
1034 8d08f18a Kostas Papadimitriou
                this.$(".network-indicator").removeClass("in-progress");
1035 8d08f18a Kostas Papadimitriou
            }
1036 126a01f2 Kostas Papadimitriou
                
1037 126a01f2 Kostas Papadimitriou
            if (this.network.get('state') == 'PENDING') {
1038 126a01f2 Kostas Papadimitriou
                this.el.addClass("pending");
1039 126a01f2 Kostas Papadimitriou
            } else {
1040 126a01f2 Kostas Papadimitriou
                this.el.removeClass("pending");
1041 126a01f2 Kostas Papadimitriou
            }
1042 126a01f2 Kostas Papadimitriou
1043 126a01f2 Kostas Papadimitriou
            if (this.network.get('state') == 'ERROR') {
1044 126a01f2 Kostas Papadimitriou
                this.el.addClass("in-error");
1045 126a01f2 Kostas Papadimitriou
                this.$(".network-indicator").addClass("error-state");
1046 126a01f2 Kostas Papadimitriou
            } else {
1047 126a01f2 Kostas Papadimitriou
                this.el.removeClass("in-error");
1048 126a01f2 Kostas Papadimitriou
                this.$(".network-indicator").removeClass("error-state");
1049 126a01f2 Kostas Papadimitriou
            }
1050 126a01f2 Kostas Papadimitriou
1051 126a01f2 Kostas Papadimitriou
            if (synnefo.config.network_strict_destroy) {
1052 9555268a Kostas Papadimitriou
                if (this.get_nics().length == 0 && 
1053 4792afbe Kostas Papadimitriou
                        !this.network.in_progress()) {
1054 126a01f2 Kostas Papadimitriou
                    this.el.removeClass("disable-destroy");
1055 126a01f2 Kostas Papadimitriou
                } else {
1056 126a01f2 Kostas Papadimitriou
                    this.el.addClass("disable-destroy");
1057 126a01f2 Kostas Papadimitriou
                }
1058 126a01f2 Kostas Papadimitriou
            }
1059 25b225a5 Kostas Papadimitriou
1060 25b225a5 Kostas Papadimitriou
            if (this.network.get("state") == "DESTROY") {
1061 25b225a5 Kostas Papadimitriou
                this.$(".spinner").show();
1062 25b225a5 Kostas Papadimitriou
                this.$(".state").addClass("destroying-state");
1063 126a01f2 Kostas Papadimitriou
                this.$(".actions").hide();
1064 126a01f2 Kostas Papadimitriou
            }
1065 126a01f2 Kostas Papadimitriou
        },
1066 126a01f2 Kostas Papadimitriou
1067 126a01f2 Kostas Papadimitriou
        // fix left border position
1068 126a01f2 Kostas Papadimitriou
        fix_left_border: function() {
1069 126a01f2 Kostas Papadimitriou
            if (!this.nics_visible) { return };
1070 126a01f2 Kostas Papadimitriou
            
1071 126a01f2 Kostas Papadimitriou
            var imgheight = 2783;
1072 126a01f2 Kostas Papadimitriou
            var opened_vm_height = 133 + 20;
1073 126a01f2 Kostas Papadimitriou
            var closed_vm_height = 61 + 20;
1074 126a01f2 Kostas Papadimitriou
            var additional_height = 25;
1075 126a01f2 Kostas Papadimitriou
1076 126a01f2 Kostas Papadimitriou
            if (!this.is_public) { 
1077 126a01f2 Kostas Papadimitriou
                imgheight = 2700;
1078 126a01f2 Kostas Papadimitriou
                additional_height = 65;
1079 126a01f2 Kostas Papadimitriou
            };
1080 126a01f2 Kostas Papadimitriou
            
1081 126a01f2 Kostas Papadimitriou
            var contents = this.$(".network-contents");
1082 126a01f2 Kostas Papadimitriou
            var last_vm = this.$(".network-machine:last .cont-toggler.open").length;
1083 126a01f2 Kostas Papadimitriou
            var last_vm_height = closed_vm_height;
1084 126a01f2 Kostas Papadimitriou
            if (last_vm > 0){
1085 126a01f2 Kostas Papadimitriou
                last_vm_height = opened_vm_height;
1086 25b225a5 Kostas Papadimitriou
            }
1087 126a01f2 Kostas Papadimitriou
1088 126a01f2 Kostas Papadimitriou
            var nics_opened = this.$(".network-machine .cont-toggler.open").length;
1089 126a01f2 Kostas Papadimitriou
            var nics_closed = this.$(".network-machine").length - nics_opened;
1090 126a01f2 Kostas Papadimitriou
1091 126a01f2 Kostas Papadimitriou
            var calc_height = (nics_opened * opened_vm_height) + (nics_closed * closed_vm_height) + additional_height; 
1092 126a01f2 Kostas Papadimitriou
            var bgpos = imgheight - calc_height + last_vm_height - 30;
1093 126a01f2 Kostas Papadimitriou
            this.$(".network-contents").css({'background-position':'33px ' + (-bgpos) + 'px'});
1094 8d08f18a Kostas Papadimitriou
        }
1095 8d08f18a Kostas Papadimitriou
    })
1096 8d08f18a Kostas Papadimitriou
1097 8d08f18a Kostas Papadimitriou
    views.PublicNetworkView = views.NetworkModelView.extend({
1098 8d08f18a Kostas Papadimitriou
        firewall: true,
1099 8d08f18a Kostas Papadimitriou
        tpl: "#public-template",
1100 126a01f2 Kostas Papadimitriou
        nic_tpl: "#public-nic-template",
1101 126a01f2 Kostas Papadimitriou
        nic_id_tpl: "#nic-{0}",
1102 9555268a Kostas Papadimitriou
        
1103 9555268a Kostas Papadimitriou
        initialize: function(network, view) {
1104 9555268a Kostas Papadimitriou
          views.PublicNetworkView.__super__.initialize.call(this, network, view);
1105 9555268a Kostas Papadimitriou
        },
1106 9555268a Kostas Papadimitriou
1107 9555268a Kostas Papadimitriou
        init_handlers: function(vm) {}
1108 9555268a Kostas Papadimitriou
    });
1109 9555268a Kostas Papadimitriou
1110 9555268a Kostas Papadimitriou
    views.GroupedPublicNetworkView = views.PublicNetworkView.extend({
1111 9555268a Kostas Papadimitriou
        main_view_id: "grouped-public",
1112 9555268a Kostas Papadimitriou
1113 9555268a Kostas Papadimitriou
        initialize: function(network, view) {
1114 9555268a Kostas Papadimitriou
          this.networks = {};
1115 9555268a Kostas Papadimitriou
          this.add_network(network);
1116 9555268a Kostas Papadimitriou
          views.GroupedPublicNetworkView.__super__.initialize.call(this, 
1117 9555268a Kostas Papadimitriou
                                                                   network, 
1118 9555268a Kostas Papadimitriou
                                                                   view);
1119 9555268a Kostas Papadimitriou
        },
1120 9555268a Kostas Papadimitriou
        
1121 9555268a Kostas Papadimitriou
        nic_in_network: function(nic) {
1122 9555268a Kostas Papadimitriou
          var nic_net  = nic.get_network();
1123 9555268a Kostas Papadimitriou
          return _.filter(this.networks, function(n) { 
1124 9555268a Kostas Papadimitriou
            return nic_net.id == n.id;
1125 9555268a Kostas Papadimitriou
          }).length > 0;
1126 9555268a Kostas Papadimitriou
        },
1127 9555268a Kostas Papadimitriou
1128 9555268a Kostas Papadimitriou
        get_nics: function() {
1129 9555268a Kostas Papadimitriou
          var n = _.flatten(_.map(this.networks, function(n){ return n.get_nics(); }));
1130 9555268a Kostas Papadimitriou
          return n
1131 9555268a Kostas Papadimitriou
        },
1132 9555268a Kostas Papadimitriou
1133 9555268a Kostas Papadimitriou
        add_network: function(net) {
1134 9555268a Kostas Papadimitriou
          this.networks[net.id] = net;
1135 9555268a Kostas Papadimitriou
        },
1136 8d08f18a Kostas Papadimitriou
1137 9555268a Kostas Papadimitriou
        remove_network: function(net) {
1138 9555268a Kostas Papadimitriou
          delete this.networks[net.id];
1139 9555268a Kostas Papadimitriou
          this.update_nics();
1140 8d08f18a Kostas Papadimitriou
        }
1141 9555268a Kostas Papadimitriou
1142 8d08f18a Kostas Papadimitriou
    })
1143 8d08f18a Kostas Papadimitriou
    
1144 8d08f18a Kostas Papadimitriou
    views.PrivateNetworkView = views.NetworkModelView.extend({
1145 8d08f18a Kostas Papadimitriou
        tpl: "#private-template",
1146 126a01f2 Kostas Papadimitriou
        nic_tpl: "#private-nic-template",
1147 126a01f2 Kostas Papadimitriou
        nic_id_tpl: "#nic-{0}"
1148 8d08f18a Kostas Papadimitriou
    })
1149 8d08f18a Kostas Papadimitriou
1150 8d08f18a Kostas Papadimitriou
    views.NetworksView = views.View.extend({
1151 8d08f18a Kostas Papadimitriou
        
1152 8d08f18a Kostas Papadimitriou
        view_id: "networks",
1153 8d08f18a Kostas Papadimitriou
        pane: "#networks-pane",
1154 8d08f18a Kostas Papadimitriou
        el: "#networks-pane",
1155 8d08f18a Kostas Papadimitriou
1156 8d08f18a Kostas Papadimitriou
        initialize: function() {
1157 8d08f18a Kostas Papadimitriou
            // elements shortcuts
1158 8d08f18a Kostas Papadimitriou
            this.create_cont = this.$("#networks-createcontainer");
1159 8d08f18a Kostas Papadimitriou
            this.container = this.$("#networks-container");
1160 8d08f18a Kostas Papadimitriou
            this.public_list = this.$(".public-networks");
1161 8d08f18a Kostas Papadimitriou
            this.private_list = this.$(".private-networks");
1162 8d08f18a Kostas Papadimitriou
            views.NetworksView.__super__.initialize.call(this);
1163 8d08f18a Kostas Papadimitriou
            this.init_handlers();
1164 8d08f18a Kostas Papadimitriou
            this.network_views = {};
1165 9555268a Kostas Papadimitriou
            this.public_network = false;
1166 8d08f18a Kostas Papadimitriou
            this.update_networks(storage.networks.models);
1167 8d08f18a Kostas Papadimitriou
            this.create_view = new views.NetworkCreateView();
1168 8d08f18a Kostas Papadimitriou
            this.connect_machines_view = new views.NetworkConnectVMsOverlay();
1169 8d08f18a Kostas Papadimitriou
        },
1170 8d08f18a Kostas Papadimitriou
        
1171 8d08f18a Kostas Papadimitriou
        exists: function(net) {
1172 8d08f18a Kostas Papadimitriou
            return this.network_views[net.id];
1173 8d08f18a Kostas Papadimitriou
        },
1174 8d08f18a Kostas Papadimitriou
1175 8d08f18a Kostas Papadimitriou
        add_or_update: function(net) {
1176 8d08f18a Kostas Papadimitriou
            var nv = this.exists(net);
1177 8d08f18a Kostas Papadimitriou
            if (!nv) {
1178 9555268a Kostas Papadimitriou
                if (net.is_public()){
1179 9555268a Kostas Papadimitriou
                  if (synnefo.config.group_public_networks) {
1180 9555268a Kostas Papadimitriou
                    if (!this.public_network) {
1181 9555268a Kostas Papadimitriou
                      // grouped public not initialized
1182 9555268a Kostas Papadimitriou
                      this.public_network = this.create_network_view(net);
1183 9555268a Kostas Papadimitriou
                    } else {
1184 9555268a Kostas Papadimitriou
                      // grouped public initialized, append
1185 9555268a Kostas Papadimitriou
                      this.public_network.add_network(net);
1186 9555268a Kostas Papadimitriou
                    }
1187 9555268a Kostas Papadimitriou
                    nv = this.public_network;
1188 9555268a Kostas Papadimitriou
                  } else {
1189 9555268a Kostas Papadimitriou
                    // no grouped view asked, fallback to default create
1190 9555268a Kostas Papadimitriou
                    nv = this.create_network_view(net);
1191 9555268a Kostas Papadimitriou
                  }
1192 9555268a Kostas Papadimitriou
                } else {
1193 9555268a Kostas Papadimitriou
                  nv = this.create_network_view(net);
1194 9555268a Kostas Papadimitriou
                }
1195 9555268a Kostas Papadimitriou
1196 8d08f18a Kostas Papadimitriou
                this.network_views[net.id] = nv;
1197 8d08f18a Kostas Papadimitriou
                
1198 8d08f18a Kostas Papadimitriou
                if (net.is_public()) {
1199 8d08f18a Kostas Papadimitriou
                    this.public_list.append(nv.el);
1200 8d08f18a Kostas Papadimitriou
                    this.public_list.show();
1201 8d08f18a Kostas Papadimitriou
                } else {
1202 8d08f18a Kostas Papadimitriou
                    this.private_list.append(nv.el);
1203 8d08f18a Kostas Papadimitriou
                    this.private_list.show();
1204 8d08f18a Kostas Papadimitriou
                }
1205 8d08f18a Kostas Papadimitriou
            }
1206 8d08f18a Kostas Papadimitriou
1207 8d08f18a Kostas Papadimitriou
            // update vms
1208 8d08f18a Kostas Papadimitriou
            // for cases where network servers list
1209 8d08f18a Kostas Papadimitriou
            // get updated after vm addition and
1210 8d08f18a Kostas Papadimitriou
            // vm_added_handler fails to append the
1211 8d08f18a Kostas Papadimitriou
            // vm to the list
1212 126a01f2 Kostas Papadimitriou
            nv.update_nics();
1213 8d08f18a Kostas Papadimitriou
            nv.update_layout();
1214 8d08f18a Kostas Papadimitriou
        },
1215 8d08f18a Kostas Papadimitriou
        
1216 8d08f18a Kostas Papadimitriou
        create_network_view: function(net) {
1217 8d08f18a Kostas Papadimitriou
            if (net.is_public()) {
1218 9555268a Kostas Papadimitriou
                if (synnefo.config.group_public_networks) {
1219 9555268a Kostas Papadimitriou
                  if (self.public_network) { return self.public_network }
1220 9555268a Kostas Papadimitriou
                  return new views.GroupedPublicNetworkView(net, this);
1221 9555268a Kostas Papadimitriou
                } else {
1222 9555268a Kostas Papadimitriou
                  return new views.PublicNetworkView(net, this);
1223 9555268a Kostas Papadimitriou
                }
1224 8d08f18a Kostas Papadimitriou
            }
1225 8d08f18a Kostas Papadimitriou
            return new views.PrivateNetworkView(net, this);
1226 8d08f18a Kostas Papadimitriou
        },
1227 8d08f18a Kostas Papadimitriou
        
1228 8d08f18a Kostas Papadimitriou
        init_handlers: function() {
1229 8d08f18a Kostas Papadimitriou
            storage.networks.bind("add", _.bind(this.network_added_handler, this, "add"));
1230 8d08f18a Kostas Papadimitriou
            storage.networks.bind("change", _.bind(this.network_changed_handler, this, "change"));
1231 8d08f18a Kostas Papadimitriou
            storage.networks.bind("reset", _.bind(this.network_changed_handler, this, "reset"));
1232 8d08f18a Kostas Papadimitriou
            storage.networks.bind("remove", _.bind(this.network_removed_handler, this, "remove"));
1233 8d08f18a Kostas Papadimitriou
1234 8d08f18a Kostas Papadimitriou
            this.$("#networkscreate").click(_.bind(function(e){
1235 8d08f18a Kostas Papadimitriou
                e.preventDefault();
1236 8d08f18a Kostas Papadimitriou
                this.create_view.show();
1237 8d08f18a Kostas Papadimitriou
            }, this));
1238 8d08f18a Kostas Papadimitriou
            
1239 8d08f18a Kostas Papadimitriou
        },
1240 8d08f18a Kostas Papadimitriou
1241 8d08f18a Kostas Papadimitriou
        update_networks: function(nets) {
1242 8d08f18a Kostas Papadimitriou
            _.each(nets, _.bind(function(net){
1243 126a01f2 Kostas Papadimitriou
                if (net.get("status") == "DELETED") { return };
1244 8d08f18a Kostas Papadimitriou
                view = this.add_or_update(net);
1245 8d08f18a Kostas Papadimitriou
            }, this));
1246 8d08f18a Kostas Papadimitriou
        },
1247 8d08f18a Kostas Papadimitriou
1248 8d08f18a Kostas Papadimitriou
        show: function() {
1249 8d08f18a Kostas Papadimitriou
            this.container.show();
1250 8d08f18a Kostas Papadimitriou
            $(this.el).show();
1251 8d08f18a Kostas Papadimitriou
        },
1252 8d08f18a Kostas Papadimitriou
1253 8d08f18a Kostas Papadimitriou
        network_added_handler: function(type, net) {
1254 8d08f18a Kostas Papadimitriou
            this.update_networks([net]);
1255 8d08f18a Kostas Papadimitriou
        },
1256 8d08f18a Kostas Papadimitriou
1257 8d08f18a Kostas Papadimitriou
        network_changed_handler: function(type, models) {
1258 8d08f18a Kostas Papadimitriou
            var nets = [];
1259 8d08f18a Kostas Papadimitriou
            if (type == "change") {
1260 8d08f18a Kostas Papadimitriou
                nets = [models]
1261 8d08f18a Kostas Papadimitriou
            } else {
1262 8d08f18a Kostas Papadimitriou
                nets = models.models;
1263 8d08f18a Kostas Papadimitriou
            }
1264 8d08f18a Kostas Papadimitriou
1265 8d08f18a Kostas Papadimitriou
            this.update_networks(nets)
1266 8d08f18a Kostas Papadimitriou
        },
1267 8d08f18a Kostas Papadimitriou
1268 8d08f18a Kostas Papadimitriou
        network_removed_handler: function(type, net) {
1269 8d08f18a Kostas Papadimitriou
            this.remove_net(net)
1270 8d08f18a Kostas Papadimitriou
            if (this.private_list.find(".network").length == 0) {
1271 8d08f18a Kostas Papadimitriou
                this.private_list.hide();
1272 8d08f18a Kostas Papadimitriou
            }
1273 4792afbe Kostas Papadimitriou
            
1274 8d08f18a Kostas Papadimitriou
        },
1275 8d08f18a Kostas Papadimitriou
1276 8d08f18a Kostas Papadimitriou
        network_added: function(net) {
1277 8d08f18a Kostas Papadimitriou
            return this.network_views[net.id];
1278 8d08f18a Kostas Papadimitriou
        },
1279 8d08f18a Kostas Papadimitriou
1280 8d08f18a Kostas Papadimitriou
        get_network_view: function(net) {
1281 8d08f18a Kostas Papadimitriou
            return this.network_views[net.id];
1282 8d08f18a Kostas Papadimitriou
        },
1283 8d08f18a Kostas Papadimitriou
1284 8d08f18a Kostas Papadimitriou
        remove_net: function(net) {
1285 8d08f18a Kostas Papadimitriou
            if (this.network_added(net)) {
1286 8d08f18a Kostas Papadimitriou
                var view = this.get_network_view(net);
1287 9555268a Kostas Papadimitriou
                if (view == this.public_network) {
1288 9555268a Kostas Papadimitriou
                  this.public_network.remove_network(net);
1289 9555268a Kostas Papadimitriou
                } else {
1290 9555268a Kostas Papadimitriou
                  view.remove();
1291 9555268a Kostas Papadimitriou
                }
1292 8d08f18a Kostas Papadimitriou
                delete this.network_views[net.id];
1293 8d08f18a Kostas Papadimitriou
            }
1294 8d08f18a Kostas Papadimitriou
        },
1295 8d08f18a Kostas Papadimitriou
1296 8d08f18a Kostas Papadimitriou
        __update_layout: function() {
1297 8d08f18a Kostas Papadimitriou
        }
1298 8d08f18a Kostas Papadimitriou
    });
1299 8d08f18a Kostas Papadimitriou
1300 8d08f18a Kostas Papadimitriou
})(this);