Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (7.2 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 75aedbe3 Kostas Papadimitriou
      vm_style: function() {
55 e6a4b75c Kostas Papadimitriou
        var cls, icon_state;
56 75aedbe3 Kostas Papadimitriou
        var style = "background-image: url('{0}')";
57 e6a4b75c Kostas Papadimitriou
        var vm = this.model.get('vm')
58 e6a4b75c Kostas Papadimitriou
        if (!vm) { return }
59 e6a4b75c Kostas Papadimitriou
        this.$(".model-logo").removeClass("state1 state2 state3 state4");
60 e6a4b75c Kostas Papadimitriou
        icon_state = vm.is_active() ? "on" : "off";
61 e6a4b75c Kostas Papadimitriou
        if (icon_state == "on") {
62 e6a4b75c Kostas Papadimitriou
          cls = "state1"
63 e6a4b75c Kostas Papadimitriou
        } else {
64 e6a4b75c Kostas Papadimitriou
          cls = "state2"
65 e6a4b75c Kostas Papadimitriou
        }
66 e6a4b75c Kostas Papadimitriou
        this.$(".model-logo").addClass(cls);
67 75aedbe3 Kostas Papadimitriou
        return style.format(this.get_vm_icon_path(this.model.get('vm'), 
68 e6a4b75c Kostas Papadimitriou
                                                  'medium2'));
69 75aedbe3 Kostas Papadimitriou
      },
70 75aedbe3 Kostas Papadimitriou
71 75aedbe3 Kostas Papadimitriou
      get_vm_icon_path: function(vm, icon_type) {
72 75aedbe3 Kostas Papadimitriou
        var os = vm.get_os();
73 75aedbe3 Kostas Papadimitriou
        var icons = window.os_icons || views.IconView.VM_OS_ICONS;
74 75aedbe3 Kostas Papadimitriou
75 75aedbe3 Kostas Papadimitriou
        if (icons.indexOf(os) == -1) {
76 75aedbe3 Kostas Papadimitriou
          os = "unknown";
77 75aedbe3 Kostas Papadimitriou
        }
78 75aedbe3 Kostas Papadimitriou
79 75aedbe3 Kostas Papadimitriou
        return views.IconView.VM_OS_ICON_TPLS()[icon_type].format(os);
80 75aedbe3 Kostas Papadimitriou
      },
81 75aedbe3 Kostas Papadimitriou
82 02effd9c Kostas Papadimitriou
      disconnect: function() {
83 75aedbe3 Kostas Papadimitriou
        this.model.actions.reset_pending();
84 75aedbe3 Kostas Papadimitriou
        this.model.set({status: 'DISCONNECTING'});
85 75aedbe3 Kostas Papadimitriou
      }
86 75aedbe3 Kostas Papadimitriou
    });
87 75aedbe3 Kostas Papadimitriou
88 75aedbe3 Kostas Papadimitriou
    views.IpView = views.ext.ModelView.extend({
89 75aedbe3 Kostas Papadimitriou
      status_map: {
90 e6a4b75c Kostas Papadimitriou
        'CONNECTED': 'In use',
91 e6a4b75c Kostas Papadimitriou
        'ACTIVE': 'In use',
92 e6a4b75c Kostas Papadimitriou
        'CONNECTING': 'Attaching',
93 e6a4b75c Kostas Papadimitriou
        'DISCONNECTING': 'Detaching',
94 e6a4b75c Kostas Papadimitriou
        'DOWN': 'In use',
95 e6a4b75c Kostas Papadimitriou
        'DISCONNECTED': 'Available',
96 b51b21db Kostas Papadimitriou
        'REMOVING': 'Destroying'
97 75aedbe3 Kostas Papadimitriou
      },
98 75aedbe3 Kostas Papadimitriou
99 75aedbe3 Kostas Papadimitriou
      status_cls_map: {
100 02effd9c Kostas Papadimitriou
        'CONNECTED': 'status-active',
101 f8aa9fc3 Kostas Papadimitriou
        'ACTIVE': 'status-active',
102 5475c563 Kostas Papadimitriou
        'CONNECTING': 'status-progress',
103 69dac1ba Kostas Papadimitriou
        'DISCONNECTING': 'status-progress',
104 75aedbe3 Kostas Papadimitriou
        'DOWN': 'status-inactive',
105 75aedbe3 Kostas Papadimitriou
        'DISCONNECTED': 'status-inactive',
106 75aedbe3 Kostas Papadimitriou
        'UP': 'status-active',
107 5bfb38cf Kostas Papadimitriou
        'REMOVING': 'status-progress destroying-state',
108 75aedbe3 Kostas Papadimitriou
      },
109 75aedbe3 Kostas Papadimitriou
110 75aedbe3 Kostas Papadimitriou
      tpl: '#ip-view-tpl',
111 75aedbe3 Kostas Papadimitriou
      auto_bind: ['connect_vm'],
112 75aedbe3 Kostas Papadimitriou
        
113 75aedbe3 Kostas Papadimitriou
      status_cls: function() {
114 75aedbe3 Kostas Papadimitriou
        return this.status_cls_map[this.model.get('status')];
115 75aedbe3 Kostas Papadimitriou
      },
116 75aedbe3 Kostas Papadimitriou
117 75aedbe3 Kostas Papadimitriou
      status_display: function(v) {
118 75aedbe3 Kostas Papadimitriou
        return this.status_map[this.model.get('status')];
119 75aedbe3 Kostas Papadimitriou
      },
120 d9128cf3 Kostas Papadimitriou
      
121 d9128cf3 Kostas Papadimitriou
      model_icon: function() {
122 d9128cf3 Kostas Papadimitriou
        var img = 'ip-icon-detached.png';
123 d9128cf3 Kostas Papadimitriou
        var src = synnefo.config.images_url + '/{0}';
124 3c446f85 Kostas Papadimitriou
        if (this.model.get('port_id')) {
125 d9128cf3 Kostas Papadimitriou
          img = 'ip-icon.png';
126 d9128cf3 Kostas Papadimitriou
        }
127 d9128cf3 Kostas Papadimitriou
        return src.format(img);
128 d9128cf3 Kostas Papadimitriou
      },
129 75aedbe3 Kostas Papadimitriou
130 75aedbe3 Kostas Papadimitriou
      show_connect_overlay: function() {
131 75aedbe3 Kostas Papadimitriou
        this.model.actions.reset_pending();
132 89dc40ca Kostas Papadimitriou
        var vms = this.model.get("network").connectable_vms;
133 75aedbe3 Kostas Papadimitriou
        var overlay = this.parent_view.connect_view;
134 75aedbe3 Kostas Papadimitriou
        overlay.show_vms(this.model, vms, [], this.connect_vm);
135 75aedbe3 Kostas Papadimitriou
      },
136 75aedbe3 Kostas Papadimitriou
      
137 75aedbe3 Kostas Papadimitriou
      disconnect: function(model, e) {
138 75aedbe3 Kostas Papadimitriou
        e && e.stopPropagation();
139 3c446f85 Kostas Papadimitriou
        this.model.do_disconnect();
140 75aedbe3 Kostas Papadimitriou
      },
141 75aedbe3 Kostas Papadimitriou
142 75aedbe3 Kostas Papadimitriou
      connect_vm: function(vms) {
143 75aedbe3 Kostas Papadimitriou
        var overlay = this.parent_view.connect_view;
144 75aedbe3 Kostas Papadimitriou
        overlay.set_in_progress();
145 75aedbe3 Kostas Papadimitriou
        _.each(vms, function(vm) {
146 75aedbe3 Kostas Papadimitriou
          vm.connect_floating_ip(this.model, this.connect_complete);
147 75aedbe3 Kostas Papadimitriou
        }, this);
148 75aedbe3 Kostas Papadimitriou
      },
149 75aedbe3 Kostas Papadimitriou
150 75aedbe3 Kostas Papadimitriou
      connect_complete: function() {
151 75aedbe3 Kostas Papadimitriou
        var overlay = this.parent_view.connect_view;
152 75aedbe3 Kostas Papadimitriou
        overlay.hide();
153 75aedbe3 Kostas Papadimitriou
        overlay.unset_in_progress();
154 e6a4b75c Kostas Papadimitriou
        this.model.set({'status': 'CONNECTING'});
155 75aedbe3 Kostas Papadimitriou
      },
156 75aedbe3 Kostas Papadimitriou
157 75aedbe3 Kostas Papadimitriou
      remove: function(model, e) {
158 75aedbe3 Kostas Papadimitriou
        e && e.stopPropagation();
159 3c446f85 Kostas Papadimitriou
        this.model.do_destroy();
160 75aedbe3 Kostas Papadimitriou
      }
161 75aedbe3 Kostas Papadimitriou
    });
162 75aedbe3 Kostas Papadimitriou
      
163 75aedbe3 Kostas Papadimitriou
    views.IpCollectionView = views.ext.CollectionView.extend({
164 75aedbe3 Kostas Papadimitriou
      collection: storage.floating_ips,
165 75aedbe3 Kostas Papadimitriou
      collection_name: 'floating_ips',
166 75aedbe3 Kostas Papadimitriou
      model_view_cls: views.IpView,
167 f784d324 Kostas Papadimitriou
      create_view: undefined, // no create overlay for IPs
168 8e13afa9 Kostas Papadimitriou
      quota_key: 'cyclades.floating_ip',
169 75aedbe3 Kostas Papadimitriou
      initialize: function() {
170 75aedbe3 Kostas Papadimitriou
        views.IpCollectionView.__super__.initialize.apply(this, arguments);
171 75aedbe3 Kostas Papadimitriou
        this.connect_view = new views.IPConnectVmOverlay();
172 f784d324 Kostas Papadimitriou
        this.creating = false;
173 f784d324 Kostas Papadimitriou
      },
174 f784d324 Kostas Papadimitriou
      
175 f784d324 Kostas Papadimitriou
      set_creating: function() {
176 f784d324 Kostas Papadimitriou
        this.creating = true;
177 f784d324 Kostas Papadimitriou
        this.create_button.addClass("in-progress");
178 f784d324 Kostas Papadimitriou
      },
179 f784d324 Kostas Papadimitriou
      
180 f784d324 Kostas Papadimitriou
      reset_creating: function() {
181 f784d324 Kostas Papadimitriou
        this.creating = false;
182 f784d324 Kostas Papadimitriou
        this.create_button.removeClass("in-progress");
183 75aedbe3 Kostas Papadimitriou
      },
184 75aedbe3 Kostas Papadimitriou
185 75aedbe3 Kostas Papadimitriou
      handle_create_click: function() {
186 f784d324 Kostas Papadimitriou
        if (this.creating) { 
187 f784d324 Kostas Papadimitriou
          return
188 f784d324 Kostas Papadimitriou
        }
189 f784d324 Kostas Papadimitriou
190 f784d324 Kostas Papadimitriou
        this.set_creating();
191 75aedbe3 Kostas Papadimitriou
        network = synnefo.storage.networks.get_floating_ips_network();
192 75aedbe3 Kostas Papadimitriou
        this.collection.create({
193 c68ad72e Kostas Papadimitriou
          floatingip: {}
194 75aedbe3 Kostas Papadimitriou
        }, 
195 75aedbe3 Kostas Papadimitriou
        {
196 8e13afa9 Kostas Papadimitriou
          success: _.bind(function() {
197 8e13afa9 Kostas Papadimitriou
            this.post_create();
198 8e13afa9 Kostas Papadimitriou
          }, this),
199 75aedbe3 Kostas Papadimitriou
          complete: _.bind(function() {
200 f784d324 Kostas Papadimitriou
            this.creating = false;
201 f784d324 Kostas Papadimitriou
            this.reset_creating();
202 75aedbe3 Kostas Papadimitriou
            this.collection.fetch();
203 75aedbe3 Kostas Papadimitriou
        }, this)});
204 75aedbe3 Kostas Papadimitriou
      }
205 75aedbe3 Kostas Papadimitriou
    });
206 75aedbe3 Kostas Papadimitriou
207 75aedbe3 Kostas Papadimitriou
    views.IpsPaneView = views.ext.PaneView.extend({
208 75aedbe3 Kostas Papadimitriou
      el: '#ips-pane',
209 75aedbe3 Kostas Papadimitriou
      collection_view_cls: views.IpCollectionView,
210 75aedbe3 Kostas Papadimitriou
    });
211 75aedbe3 Kostas Papadimitriou
212 75aedbe3 Kostas Papadimitriou
    views.IPConnectVmOverlay = views.NetworkConnectVMsOverlay.extend({
213 75aedbe3 Kostas Papadimitriou
        css_class: "overlay-info connect-ip",
214 3c446f85 Kostas Papadimitriou
        title: "Attach IP to machine",
215 75aedbe3 Kostas Papadimitriou
        allow_multiple: false,
216 75aedbe3 Kostas Papadimitriou
217 75aedbe3 Kostas Papadimitriou
        show_vms: function(ip, vms, selected, callback, subtitle) {
218 75aedbe3 Kostas Papadimitriou
            views.IPConnectVmOverlay.__super__.show_vms.call(this, 
219 75aedbe3 Kostas Papadimitriou
                  undefined, vms, selected, callback, subtitle);
220 75aedbe3 Kostas Papadimitriou
            this.ip = ip;
221 3c446f85 Kostas Papadimitriou
            this.set_desc("Select machine to attach <em>" + 
222 75aedbe3 Kostas Papadimitriou
                          ip.escape('floating_ip_address') + 
223 75aedbe3 Kostas Papadimitriou
                          "</em> to.");
224 75aedbe3 Kostas Papadimitriou
        },
225 75aedbe3 Kostas Papadimitriou
        
226 75aedbe3 Kostas Papadimitriou
        set_desc: function(desc) {
227 75aedbe3 Kostas Papadimitriou
            this.$(".description p").html(desc);
228 75aedbe3 Kostas Papadimitriou
        }
229 75aedbe3 Kostas Papadimitriou
230 75aedbe3 Kostas Papadimitriou
    });
231 75aedbe3 Kostas Papadimitriou
232 75aedbe3 Kostas Papadimitriou
})(this);