Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / ui / static / snf / js / ui / web / ui_ips_view.js @ a45b30a7

History | View | Annotate | Download (7.8 kB)

1 75aedbe3 Kostas Papadimitriou
// Copyright 2011 GRNET S.A. All rights reserved.
2 75aedbe3 Kostas Papadimitriou
// 
3 75aedbe3 Kostas Papadimitriou
// Redistribution and use in source and binary forms, with or
4 75aedbe3 Kostas Papadimitriou
// without modification, are permitted provided that the following
5 75aedbe3 Kostas Papadimitriou
// conditions are met:
6 75aedbe3 Kostas Papadimitriou
// 
7 75aedbe3 Kostas Papadimitriou
//   1. Redistributions of source code must retain the above
8 75aedbe3 Kostas Papadimitriou
//      copyright notice, this list of conditions and the following
9 75aedbe3 Kostas Papadimitriou
//      disclaimer.
10 75aedbe3 Kostas Papadimitriou
// 
11 75aedbe3 Kostas Papadimitriou
//   2. Redistributions in binary form must reproduce the above
12 75aedbe3 Kostas Papadimitriou
//      copyright notice, this list of conditions and the following
13 75aedbe3 Kostas Papadimitriou
//      disclaimer in the documentation and/or other materials
14 75aedbe3 Kostas Papadimitriou
//      provided with the distribution.
15 75aedbe3 Kostas Papadimitriou
// 
16 75aedbe3 Kostas Papadimitriou
// THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 75aedbe3 Kostas Papadimitriou
// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 75aedbe3 Kostas Papadimitriou
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 75aedbe3 Kostas Papadimitriou
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 75aedbe3 Kostas Papadimitriou
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 75aedbe3 Kostas Papadimitriou
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 75aedbe3 Kostas Papadimitriou
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 75aedbe3 Kostas Papadimitriou
// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 75aedbe3 Kostas Papadimitriou
// AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 75aedbe3 Kostas Papadimitriou
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 75aedbe3 Kostas Papadimitriou
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 75aedbe3 Kostas Papadimitriou
// POSSIBILITY OF SUCH DAMAGE.
28 75aedbe3 Kostas Papadimitriou
// 
29 75aedbe3 Kostas Papadimitriou
// The views and conclusions contained in the software and
30 75aedbe3 Kostas Papadimitriou
// documentation are those of the authors and should not be
31 75aedbe3 Kostas Papadimitriou
// interpreted as representing official policies, either expressed
32 75aedbe3 Kostas Papadimitriou
// or implied, of GRNET S.A.
33 75aedbe3 Kostas Papadimitriou
// 
34 75aedbe3 Kostas Papadimitriou
35 75aedbe3 Kostas Papadimitriou
;(function(root){
36 75aedbe3 Kostas Papadimitriou
    
37 75aedbe3 Kostas Papadimitriou
    // root
38 75aedbe3 Kostas Papadimitriou
    var root = root;
39 75aedbe3 Kostas Papadimitriou
    
40 75aedbe3 Kostas Papadimitriou
    // setup namepsaces
41 75aedbe3 Kostas Papadimitriou
    var snf = root.synnefo = root.synnefo || {};
42 75aedbe3 Kostas Papadimitriou
    var views = snf.views = snf.views || {}
43 75aedbe3 Kostas Papadimitriou
    var storage = snf.storage = snf.storage || {};
44 75aedbe3 Kostas Papadimitriou
45 75aedbe3 Kostas Papadimitriou
    views.IpPortView = views.ext.ModelView.extend({
46 75aedbe3 Kostas Papadimitriou
      tpl: '#ip-port-view-tpl',
47 75aedbe3 Kostas Papadimitriou
      
48 c700cb69 Kostas Papadimitriou
      init: function() {
49 c700cb69 Kostas Papadimitriou
        this.model.bind("remove", function() {
50 c700cb69 Kostas Papadimitriou
          this.el.remove();
51 c700cb69 Kostas Papadimitriou
        }, this);
52 c700cb69 Kostas Papadimitriou
      },
53 c700cb69 Kostas Papadimitriou
54 0c66520a Kostas Papadimitriou
      vm_status_cls: function(vm) {
55 0c66520a Kostas Papadimitriou
        var cls = 'inner clearfix main-content';
56 0c66520a Kostas Papadimitriou
        if (!this.model.get('vm')) { return cls }
57 0c66520a Kostas Papadimitriou
        if (this.model.get('vm').in_error_state()) {
58 0c66520a Kostas Papadimitriou
          cls += ' vm-status-error';
59 0c66520a Kostas Papadimitriou
        }
60 0c66520a Kostas Papadimitriou
        return cls
61 0c66520a Kostas Papadimitriou
      },
62 0c66520a Kostas Papadimitriou
      
63 75aedbe3 Kostas Papadimitriou
      vm_style: function() {
64 e6a4b75c Kostas Papadimitriou
        var cls, icon_state;
65 75aedbe3 Kostas Papadimitriou
        var style = "background-image: url('{0}')";
66 e6a4b75c Kostas Papadimitriou
        var vm = this.model.get('vm')
67 e6a4b75c Kostas Papadimitriou
        if (!vm) { return }
68 e6a4b75c Kostas Papadimitriou
        this.$(".model-logo").removeClass("state1 state2 state3 state4");
69 e6a4b75c Kostas Papadimitriou
        icon_state = vm.is_active() ? "on" : "off";
70 e6a4b75c Kostas Papadimitriou
        if (icon_state == "on") {
71 e6a4b75c Kostas Papadimitriou
          cls = "state1"
72 e6a4b75c Kostas Papadimitriou
        } else {
73 e6a4b75c Kostas Papadimitriou
          cls = "state2"
74 e6a4b75c Kostas Papadimitriou
        }
75 e6a4b75c Kostas Papadimitriou
        this.$(".model-logo").addClass(cls);
76 75aedbe3 Kostas Papadimitriou
        return style.format(this.get_vm_icon_path(this.model.get('vm'), 
77 e6a4b75c Kostas Papadimitriou
                                                  'medium2'));
78 75aedbe3 Kostas Papadimitriou
      },
79 75aedbe3 Kostas Papadimitriou
80 75aedbe3 Kostas Papadimitriou
      get_vm_icon_path: function(vm, icon_type) {
81 75aedbe3 Kostas Papadimitriou
        var os = vm.get_os();
82 75aedbe3 Kostas Papadimitriou
        var icons = window.os_icons || views.IconView.VM_OS_ICONS;
83 75aedbe3 Kostas Papadimitriou
84 75aedbe3 Kostas Papadimitriou
        if (icons.indexOf(os) == -1) {
85 75aedbe3 Kostas Papadimitriou
          os = "unknown";
86 75aedbe3 Kostas Papadimitriou
        }
87 75aedbe3 Kostas Papadimitriou
88 75aedbe3 Kostas Papadimitriou
        return views.IconView.VM_OS_ICON_TPLS()[icon_type].format(os);
89 75aedbe3 Kostas Papadimitriou
      },
90 75aedbe3 Kostas Papadimitriou
91 02effd9c Kostas Papadimitriou
      disconnect: function() {
92 75aedbe3 Kostas Papadimitriou
        this.model.actions.reset_pending();
93 75aedbe3 Kostas Papadimitriou
        this.model.set({status: 'DISCONNECTING'});
94 75aedbe3 Kostas Papadimitriou
      }
95 75aedbe3 Kostas Papadimitriou
    });
96 75aedbe3 Kostas Papadimitriou
97 75aedbe3 Kostas Papadimitriou
    views.IpView = views.ext.ModelView.extend({
98 75aedbe3 Kostas Papadimitriou
      status_map: {
99 e6a4b75c Kostas Papadimitriou
        'CONNECTED': 'In use',
100 e6a4b75c Kostas Papadimitriou
        'ACTIVE': 'In use',
101 e6a4b75c Kostas Papadimitriou
        'CONNECTING': 'Attaching',
102 e6a4b75c Kostas Papadimitriou
        'DISCONNECTING': 'Detaching',
103 e6a4b75c Kostas Papadimitriou
        'DOWN': 'In use',
104 e6a4b75c Kostas Papadimitriou
        'DISCONNECTED': 'Available',
105 b51b21db Kostas Papadimitriou
        'REMOVING': 'Destroying'
106 75aedbe3 Kostas Papadimitriou
      },
107 75aedbe3 Kostas Papadimitriou
108 75aedbe3 Kostas Papadimitriou
      status_cls_map: {
109 02effd9c Kostas Papadimitriou
        'CONNECTED': 'status-active',
110 f8aa9fc3 Kostas Papadimitriou
        'ACTIVE': 'status-active',
111 5475c563 Kostas Papadimitriou
        'CONNECTING': 'status-progress',
112 69dac1ba Kostas Papadimitriou
        'DISCONNECTING': 'status-progress',
113 75aedbe3 Kostas Papadimitriou
        'DOWN': 'status-inactive',
114 75aedbe3 Kostas Papadimitriou
        'DISCONNECTED': 'status-inactive',
115 75aedbe3 Kostas Papadimitriou
        'UP': 'status-active',
116 5bfb38cf Kostas Papadimitriou
        'REMOVING': 'status-progress destroying-state',
117 75aedbe3 Kostas Papadimitriou
      },
118 75aedbe3 Kostas Papadimitriou
119 75aedbe3 Kostas Papadimitriou
      tpl: '#ip-view-tpl',
120 75aedbe3 Kostas Papadimitriou
      auto_bind: ['connect_vm'],
121 75aedbe3 Kostas Papadimitriou
        
122 75aedbe3 Kostas Papadimitriou
      status_cls: function() {
123 75aedbe3 Kostas Papadimitriou
        return this.status_cls_map[this.model.get('status')];
124 75aedbe3 Kostas Papadimitriou
      },
125 75aedbe3 Kostas Papadimitriou
126 75aedbe3 Kostas Papadimitriou
      status_display: function(v) {
127 75aedbe3 Kostas Papadimitriou
        return this.status_map[this.model.get('status')];
128 75aedbe3 Kostas Papadimitriou
      },
129 d9128cf3 Kostas Papadimitriou
      
130 d9128cf3 Kostas Papadimitriou
      model_icon: function() {
131 d9128cf3 Kostas Papadimitriou
        var img = 'ip-icon-detached.png';
132 d9128cf3 Kostas Papadimitriou
        var src = synnefo.config.images_url + '/{0}';
133 3c446f85 Kostas Papadimitriou
        if (this.model.get('port_id')) {
134 d9128cf3 Kostas Papadimitriou
          img = 'ip-icon.png';
135 d9128cf3 Kostas Papadimitriou
        }
136 d9128cf3 Kostas Papadimitriou
        return src.format(img);
137 d9128cf3 Kostas Papadimitriou
      },
138 75aedbe3 Kostas Papadimitriou
139 75aedbe3 Kostas Papadimitriou
      show_connect_overlay: function() {
140 75aedbe3 Kostas Papadimitriou
        this.model.actions.reset_pending();
141 89dc40ca Kostas Papadimitriou
        var vms = this.model.get("network").connectable_vms;
142 75aedbe3 Kostas Papadimitriou
        var overlay = this.parent_view.connect_view;
143 75aedbe3 Kostas Papadimitriou
        overlay.show_vms(this.model, vms, [], this.connect_vm);
144 75aedbe3 Kostas Papadimitriou
      },
145 75aedbe3 Kostas Papadimitriou
      
146 75aedbe3 Kostas Papadimitriou
      disconnect: function(model, e) {
147 75aedbe3 Kostas Papadimitriou
        e && e.stopPropagation();
148 3c446f85 Kostas Papadimitriou
        this.model.do_disconnect();
149 75aedbe3 Kostas Papadimitriou
      },
150 75aedbe3 Kostas Papadimitriou
151 75aedbe3 Kostas Papadimitriou
      connect_vm: function(vms) {
152 75aedbe3 Kostas Papadimitriou
        var overlay = this.parent_view.connect_view;
153 75aedbe3 Kostas Papadimitriou
        overlay.set_in_progress();
154 75aedbe3 Kostas Papadimitriou
        _.each(vms, function(vm) {
155 681c9851 Kostas Papadimitriou
          vm.connect_floating_ip(this.model, 
156 681c9851 Kostas Papadimitriou
                                 _.bind(this.connect_complete,this),
157 681c9851 Kostas Papadimitriou
                                 _.bind(this.connect_error, this));
158 75aedbe3 Kostas Papadimitriou
        }, this);
159 75aedbe3 Kostas Papadimitriou
      },
160 75aedbe3 Kostas Papadimitriou
161 75aedbe3 Kostas Papadimitriou
      connect_complete: function() {
162 75aedbe3 Kostas Papadimitriou
        var overlay = this.parent_view.connect_view;
163 75aedbe3 Kostas Papadimitriou
        overlay.hide();
164 75aedbe3 Kostas Papadimitriou
        overlay.unset_in_progress();
165 e6a4b75c Kostas Papadimitriou
        this.model.set({'status': 'CONNECTING'});
166 75aedbe3 Kostas Papadimitriou
      },
167 75aedbe3 Kostas Papadimitriou
168 681c9851 Kostas Papadimitriou
      connect_error: function() {
169 681c9851 Kostas Papadimitriou
        var overlay = this.parent_view.connect_view;
170 681c9851 Kostas Papadimitriou
        overlay.hide();
171 681c9851 Kostas Papadimitriou
        overlay.unset_in_progress();
172 681c9851 Kostas Papadimitriou
      },
173 681c9851 Kostas Papadimitriou
174 75aedbe3 Kostas Papadimitriou
      remove: function(model, e) {
175 75aedbe3 Kostas Papadimitriou
        e && e.stopPropagation();
176 3c446f85 Kostas Papadimitriou
        this.model.do_destroy();
177 75aedbe3 Kostas Papadimitriou
      }
178 75aedbe3 Kostas Papadimitriou
    });
179 75aedbe3 Kostas Papadimitriou
      
180 75aedbe3 Kostas Papadimitriou
    views.IpCollectionView = views.ext.CollectionView.extend({
181 75aedbe3 Kostas Papadimitriou
      collection: storage.floating_ips,
182 75aedbe3 Kostas Papadimitriou
      collection_name: 'floating_ips',
183 75aedbe3 Kostas Papadimitriou
      model_view_cls: views.IpView,
184 f784d324 Kostas Papadimitriou
      create_view: undefined, // no create overlay for IPs
185 8e13afa9 Kostas Papadimitriou
      quota_key: 'cyclades.floating_ip',
186 75aedbe3 Kostas Papadimitriou
      initialize: function() {
187 75aedbe3 Kostas Papadimitriou
        views.IpCollectionView.__super__.initialize.apply(this, arguments);
188 75aedbe3 Kostas Papadimitriou
        this.connect_view = new views.IPConnectVmOverlay();
189 f784d324 Kostas Papadimitriou
        this.creating = false;
190 f784d324 Kostas Papadimitriou
      },
191 f784d324 Kostas Papadimitriou
      
192 f784d324 Kostas Papadimitriou
      set_creating: function() {
193 f784d324 Kostas Papadimitriou
        this.creating = true;
194 f784d324 Kostas Papadimitriou
        this.create_button.addClass("in-progress");
195 f784d324 Kostas Papadimitriou
      },
196 f784d324 Kostas Papadimitriou
      
197 f784d324 Kostas Papadimitriou
      reset_creating: function() {
198 f784d324 Kostas Papadimitriou
        this.creating = false;
199 f784d324 Kostas Papadimitriou
        this.create_button.removeClass("in-progress");
200 75aedbe3 Kostas Papadimitriou
      },
201 75aedbe3 Kostas Papadimitriou
202 75aedbe3 Kostas Papadimitriou
      handle_create_click: function() {
203 f784d324 Kostas Papadimitriou
        if (this.creating) { 
204 f784d324 Kostas Papadimitriou
          return
205 f784d324 Kostas Papadimitriou
        }
206 f784d324 Kostas Papadimitriou
207 f784d324 Kostas Papadimitriou
        this.set_creating();
208 75aedbe3 Kostas Papadimitriou
        network = synnefo.storage.networks.get_floating_ips_network();
209 75aedbe3 Kostas Papadimitriou
        this.collection.create({
210 c68ad72e Kostas Papadimitriou
          floatingip: {}
211 75aedbe3 Kostas Papadimitriou
        }, 
212 75aedbe3 Kostas Papadimitriou
        {
213 8e13afa9 Kostas Papadimitriou
          success: _.bind(function() {
214 8e13afa9 Kostas Papadimitriou
            this.post_create();
215 8e13afa9 Kostas Papadimitriou
          }, this),
216 75aedbe3 Kostas Papadimitriou
          complete: _.bind(function() {
217 f784d324 Kostas Papadimitriou
            this.creating = false;
218 f784d324 Kostas Papadimitriou
            this.reset_creating();
219 75aedbe3 Kostas Papadimitriou
            this.collection.fetch();
220 75aedbe3 Kostas Papadimitriou
        }, this)});
221 75aedbe3 Kostas Papadimitriou
      }
222 75aedbe3 Kostas Papadimitriou
    });
223 75aedbe3 Kostas Papadimitriou
224 75aedbe3 Kostas Papadimitriou
    views.IpsPaneView = views.ext.PaneView.extend({
225 75aedbe3 Kostas Papadimitriou
      el: '#ips-pane',
226 75aedbe3 Kostas Papadimitriou
      collection_view_cls: views.IpCollectionView,
227 75aedbe3 Kostas Papadimitriou
    });
228 75aedbe3 Kostas Papadimitriou
229 75aedbe3 Kostas Papadimitriou
    views.IPConnectVmOverlay = views.NetworkConnectVMsOverlay.extend({
230 75aedbe3 Kostas Papadimitriou
        css_class: "overlay-info connect-ip",
231 3c446f85 Kostas Papadimitriou
        title: "Attach IP to machine",
232 75aedbe3 Kostas Papadimitriou
        allow_multiple: false,
233 75aedbe3 Kostas Papadimitriou
234 75aedbe3 Kostas Papadimitriou
        show_vms: function(ip, vms, selected, callback, subtitle) {
235 75aedbe3 Kostas Papadimitriou
            views.IPConnectVmOverlay.__super__.show_vms.call(this, 
236 75aedbe3 Kostas Papadimitriou
                  undefined, vms, selected, callback, subtitle);
237 75aedbe3 Kostas Papadimitriou
            this.ip = ip;
238 3c446f85 Kostas Papadimitriou
            this.set_desc("Select machine to attach <em>" + 
239 75aedbe3 Kostas Papadimitriou
                          ip.escape('floating_ip_address') + 
240 75aedbe3 Kostas Papadimitriou
                          "</em> to.");
241 75aedbe3 Kostas Papadimitriou
        },
242 75aedbe3 Kostas Papadimitriou
        
243 75aedbe3 Kostas Papadimitriou
        set_desc: function(desc) {
244 75aedbe3 Kostas Papadimitriou
            this.$(".description p").html(desc);
245 75aedbe3 Kostas Papadimitriou
        }
246 75aedbe3 Kostas Papadimitriou
247 75aedbe3 Kostas Papadimitriou
    });
248 75aedbe3 Kostas Papadimitriou
249 75aedbe3 Kostas Papadimitriou
})(this);