Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / ui / static / snf / js / neutron.js @ 31bc4729

History | View | Annotate | Download (11.7 kB)

1 fff8bd58 Kostas Papadimitriou
;(function(root){
2 fff8bd58 Kostas Papadimitriou
    // Neutron api models, collections, helpers
3 fff8bd58 Kostas Papadimitriou
  
4 fff8bd58 Kostas Papadimitriou
    // root
5 fff8bd58 Kostas Papadimitriou
    var root = root;
6 fff8bd58 Kostas Papadimitriou
    
7 fff8bd58 Kostas Papadimitriou
    // setup namepsaces
8 fff8bd58 Kostas Papadimitriou
    var snf = root.synnefo = root.synnefo || {};
9 fff8bd58 Kostas Papadimitriou
    var snfmodels = snf.models = snf.models || {}
10 fff8bd58 Kostas Papadimitriou
    var models = snfmodels.networks = snfmodels.networks || {};
11 fff8bd58 Kostas Papadimitriou
    var storage = snf.storage = snf.storage || {};
12 fff8bd58 Kostas Papadimitriou
    var util = snf.util = snf.util || {};
13 fff8bd58 Kostas Papadimitriou
14 fff8bd58 Kostas Papadimitriou
    // shortcuts
15 fff8bd58 Kostas Papadimitriou
    var bb = root.Backbone;
16 fff8bd58 Kostas Papadimitriou
    var slice = Array.prototype.slice
17 fff8bd58 Kostas Papadimitriou
18 fff8bd58 Kostas Papadimitriou
    // logging
19 fff8bd58 Kostas Papadimitriou
    var logger = new snf.logging.logger("SNF-MODELS");
20 fff8bd58 Kostas Papadimitriou
    var debug = _.bind(logger.debug, logger);
21 fff8bd58 Kostas Papadimitriou
    
22 fff8bd58 Kostas Papadimitriou
    // Neutron base model, extending existing synnefo model
23 fff8bd58 Kostas Papadimitriou
    models.NetworkModel = snfmodels.Model.extend({
24 fff8bd58 Kostas Papadimitriou
      api_type: 'compute'
25 fff8bd58 Kostas Papadimitriou
    });
26 fff8bd58 Kostas Papadimitriou
    
27 fff8bd58 Kostas Papadimitriou
    // Neutron base collection, common neutron collection params are shared
28 fff8bd58 Kostas Papadimitriou
    models.NetworkCollection = snfmodels.Collection.extend({
29 fff8bd58 Kostas Papadimitriou
      api_type: 'compute',
30 fff8bd58 Kostas Papadimitriou
      details: true,
31 fff8bd58 Kostas Papadimitriou
      noUpdate: true,
32 fff8bd58 Kostas Papadimitriou
      updateEntries: true
33 fff8bd58 Kostas Papadimitriou
    });
34 fff8bd58 Kostas Papadimitriou
  
35 fff8bd58 Kostas Papadimitriou
    // Subnet model
36 fff8bd58 Kostas Papadimitriou
    models.Subnet = models.NetworkModel.extend();
37 fff8bd58 Kostas Papadimitriou
    
38 fff8bd58 Kostas Papadimitriou
    // Subnet collection
39 fff8bd58 Kostas Papadimitriou
    models.Subnets = models.NetworkCollection.extend({
40 fff8bd58 Kostas Papadimitriou
      model: models.Subnet,
41 fff8bd58 Kostas Papadimitriou
      details: false,
42 fff8bd58 Kostas Papadimitriou
      path: 'subnets',
43 fff8bd58 Kostas Papadimitriou
      parse: function(resp) {
44 fff8bd58 Kostas Papadimitriou
        return resp.subnets
45 fff8bd58 Kostas Papadimitriou
      }
46 fff8bd58 Kostas Papadimitriou
    });
47 fff8bd58 Kostas Papadimitriou
    
48 fff8bd58 Kostas Papadimitriou
    // Network 
49 fff8bd58 Kostas Papadimitriou
    models.Network = models.NetworkModel.extend({
50 fff8bd58 Kostas Papadimitriou
      path: 'networks',
51 fff8bd58 Kostas Papadimitriou
52 fff8bd58 Kostas Papadimitriou
      // Available network actions.
53 fff8bd58 Kostas Papadimitriou
      // connect: 
54 fff8bd58 Kostas Papadimitriou
      model_actions: {
55 fff8bd58 Kostas Papadimitriou
        'connect': [['status', 'is_public'], function() {
56 fff8bd58 Kostas Papadimitriou
          //TODO: Also check network status
57 fff8bd58 Kostas Papadimitriou
          return !this.is_public() && _.contains(['ACTIVE'], this.get('status'));
58 fff8bd58 Kostas Papadimitriou
        }],
59 fff8bd58 Kostas Papadimitriou
        'remove': [['status', 'is_public'], function() {
60 fff8bd58 Kostas Papadimitriou
          //TODO: Also check network status
61 fff8bd58 Kostas Papadimitriou
          return !this.is_public() && _.contains(['ACTIVE'], this.get('status'));
62 fff8bd58 Kostas Papadimitriou
        }]
63 fff8bd58 Kostas Papadimitriou
      },
64 fff8bd58 Kostas Papadimitriou
65 fff8bd58 Kostas Papadimitriou
      proxy_attrs: {
66 fff8bd58 Kostas Papadimitriou
        'is_public': [
67 fff8bd58 Kostas Papadimitriou
          ['router:external', 'public'], function() {
68 fff8bd58 Kostas Papadimitriou
            return this.get('router:external') || this.get('public')
69 fff8bd58 Kostas Papadimitriou
          } 
70 fff8bd58 Kostas Papadimitriou
        ],
71 fff8bd58 Kostas Papadimitriou
        'ext_status': [
72 fff8bd58 Kostas Papadimitriou
          ['status'], function(st) {
73 a681ab44 Kostas Papadimitriou
            if (this.get('ext_status') == 'REMOVING') {
74 a681ab44 Kostas Papadimitriou
              return 'REMOVING'
75 a681ab44 Kostas Papadimitriou
            }
76 fff8bd58 Kostas Papadimitriou
            if (this.pending_connections) {
77 fff8bd58 Kostas Papadimitriou
              return 'CONNECTING'
78 fff8bd58 Kostas Papadimitriou
            } else if (this.pending_disconnects) {
79 fff8bd58 Kostas Papadimitriou
              return 'DISCONNECTING'
80 fff8bd58 Kostas Papadimitriou
            } else {
81 fff8bd58 Kostas Papadimitriou
              return st
82 fff8bd58 Kostas Papadimitriou
            }
83 fff8bd58 Kostas Papadimitriou
        }],
84 fff8bd58 Kostas Papadimitriou
        'in_progress': [
85 fff8bd58 Kostas Papadimitriou
          ['ext_status'], function() {
86 fff8bd58 Kostas Papadimitriou
            return _.contains(['CONNECTING', 
87 fff8bd58 Kostas Papadimitriou
                               'DISCONNECTING', 
88 fff8bd58 Kostas Papadimitriou
                               'REMOVING'], 
89 fff8bd58 Kostas Papadimitriou
                               this.get('ext_status'))
90 fff8bd58 Kostas Papadimitriou
          }  
91 fff8bd58 Kostas Papadimitriou
        ]
92 fff8bd58 Kostas Papadimitriou
      },
93 fff8bd58 Kostas Papadimitriou
      
94 fff8bd58 Kostas Papadimitriou
      // call rename api
95 fff8bd58 Kostas Papadimitriou
      rename: function(new_name, cb) {
96 fff8bd58 Kostas Papadimitriou
          this.sync("update", this, {
97 fff8bd58 Kostas Papadimitriou
              critical: true,
98 fff8bd58 Kostas Papadimitriou
              data: {
99 fff8bd58 Kostas Papadimitriou
                  'network': {
100 fff8bd58 Kostas Papadimitriou
                      'name': new_name
101 fff8bd58 Kostas Papadimitriou
                  }
102 fff8bd58 Kostas Papadimitriou
              }, 
103 fff8bd58 Kostas Papadimitriou
              // do the rename after the method succeeds
104 fff8bd58 Kostas Papadimitriou
              success: _.bind(function(){
105 fff8bd58 Kostas Papadimitriou
                  //this.set({name: new_name});
106 fff8bd58 Kostas Papadimitriou
                  snf.api.trigger("call");
107 fff8bd58 Kostas Papadimitriou
              }, this),
108 fff8bd58 Kostas Papadimitriou
              complete: cb || function() {}
109 fff8bd58 Kostas Papadimitriou
          });
110 fff8bd58 Kostas Papadimitriou
      },
111 fff8bd58 Kostas Papadimitriou
112 fff8bd58 Kostas Papadimitriou
      pending_connections: 0,
113 fff8bd58 Kostas Papadimitriou
      pending_disconnects: 0,
114 fff8bd58 Kostas Papadimitriou
115 fff8bd58 Kostas Papadimitriou
      initialize: function() {
116 fff8bd58 Kostas Papadimitriou
        models.Network.__super__.initialize.apply(this, arguments);
117 fff8bd58 Kostas Papadimitriou
        var self = this;
118 fff8bd58 Kostas Papadimitriou
        this.subnets = new Backbone.FilteredCollection(undefined, {
119 fff8bd58 Kostas Papadimitriou
          collection: synnefo.storage.subnets,
120 fff8bd58 Kostas Papadimitriou
          collectionFilter: function(m) {
121 fff8bd58 Kostas Papadimitriou
            return self.id == m.get('network_id')
122 fff8bd58 Kostas Papadimitriou
          }
123 fff8bd58 Kostas Papadimitriou
        });
124 fff8bd58 Kostas Papadimitriou
        this.ports = new Backbone.FilteredCollection(undefined, {
125 fff8bd58 Kostas Papadimitriou
          collection: synnefo.storage.ports,
126 fff8bd58 Kostas Papadimitriou
          collectionFilter: function(m) {
127 fff8bd58 Kostas Papadimitriou
            return self.id == m.get('network_id')
128 fff8bd58 Kostas Papadimitriou
          }
129 fff8bd58 Kostas Papadimitriou
        });
130 fff8bd58 Kostas Papadimitriou
        this.ports.network = this;
131 fff8bd58 Kostas Papadimitriou
        this.ports.bind("add", function() {
132 fff8bd58 Kostas Papadimitriou
          this.pending_connections--;
133 fff8bd58 Kostas Papadimitriou
          this.update_connecting_status();
134 fff8bd58 Kostas Papadimitriou
        }, this);
135 fff8bd58 Kostas Papadimitriou
        this.ports.bind("remove", function() {
136 fff8bd58 Kostas Papadimitriou
          this.pending_disconnects--;
137 fff8bd58 Kostas Papadimitriou
          this.update_connecting_status();
138 fff8bd58 Kostas Papadimitriou
        }, this);
139 fff8bd58 Kostas Papadimitriou
        this.set({ports: this.ports});
140 fff8bd58 Kostas Papadimitriou
      },
141 fff8bd58 Kostas Papadimitriou
      
142 fff8bd58 Kostas Papadimitriou
      update_connecting_status: function() {
143 fff8bd58 Kostas Papadimitriou
        if (this.pending_connections <= 0) {
144 fff8bd58 Kostas Papadimitriou
          this.pending_connections = 0;
145 fff8bd58 Kostas Papadimitriou
        }
146 fff8bd58 Kostas Papadimitriou
        if (this.pending_disconnects <= 0) {
147 fff8bd58 Kostas Papadimitriou
          this.pending_disconnects = 0;
148 fff8bd58 Kostas Papadimitriou
        }
149 fff8bd58 Kostas Papadimitriou
        this.trigger('change:status', this.get('status'));
150 fff8bd58 Kostas Papadimitriou
      },
151 fff8bd58 Kostas Papadimitriou
152 fff8bd58 Kostas Papadimitriou
      get_nics: function() {
153 fff8bd58 Kostas Papadimitriou
        return this.nics.models
154 fff8bd58 Kostas Papadimitriou
      },
155 fff8bd58 Kostas Papadimitriou
156 fff8bd58 Kostas Papadimitriou
      is_public: function() {
157 fff8bd58 Kostas Papadimitriou
        return this.get('router:external')
158 fff8bd58 Kostas Papadimitriou
      },
159 fff8bd58 Kostas Papadimitriou
160 fff8bd58 Kostas Papadimitriou
      pluggable_vms: function() {
161 fff8bd58 Kostas Papadimitriou
        var vms = synnefo.storage.vms.models;
162 fff8bd58 Kostas Papadimitriou
        // TODO: filter out vms
163 fff8bd58 Kostas Papadimitriou
        return vms;
164 fff8bd58 Kostas Papadimitriou
      },
165 fff8bd58 Kostas Papadimitriou
    
166 fff8bd58 Kostas Papadimitriou
      connect_vm: function(vm, cb) {
167 fff8bd58 Kostas Papadimitriou
        var self = this;
168 fff8bd58 Kostas Papadimitriou
        var data = {
169 fff8bd58 Kostas Papadimitriou
          port: {
170 fff8bd58 Kostas Papadimitriou
            network_id: this.id,
171 fff8bd58 Kostas Papadimitriou
            device_id: vm.id
172 fff8bd58 Kostas Papadimitriou
          }
173 fff8bd58 Kostas Papadimitriou
        }
174 fff8bd58 Kostas Papadimitriou
175 fff8bd58 Kostas Papadimitriou
        this.pending_connections++;
176 fff8bd58 Kostas Papadimitriou
        this.update_connecting_status();
177 fff8bd58 Kostas Papadimitriou
        synnefo.storage.ports.create(data, {complete: cb});
178 fff8bd58 Kostas Papadimitriou
      }
179 fff8bd58 Kostas Papadimitriou
    });
180 fff8bd58 Kostas Papadimitriou
181 fff8bd58 Kostas Papadimitriou
    models.CombinedPublicNetwork = models.Network.extend({
182 fff8bd58 Kostas Papadimitriou
      defaults: {
183 fff8bd58 Kostas Papadimitriou
        'admin_state_up': true,
184 fff8bd58 Kostas Papadimitriou
        'id': 'snf-combined-public-network',
185 fff8bd58 Kostas Papadimitriou
        'name': 'Public',
186 fff8bd58 Kostas Papadimitriou
        'status': 'ACTIVE',
187 fff8bd58 Kostas Papadimitriou
        'router:external': true,
188 fff8bd58 Kostas Papadimitriou
        'shared': false,
189 fff8bd58 Kostas Papadimitriou
        'rename_disabled': true
190 fff8bd58 Kostas Papadimitriou
      },
191 fff8bd58 Kostas Papadimitriou
      
192 fff8bd58 Kostas Papadimitriou
      initialize: function() {
193 fff8bd58 Kostas Papadimitriou
        models.Network.__super__.initialize.apply(this, arguments);
194 fff8bd58 Kostas Papadimitriou
        var self = this;
195 fff8bd58 Kostas Papadimitriou
        this.ports = new Backbone.FilteredCollection(undefined, {
196 fff8bd58 Kostas Papadimitriou
          collection: synnefo.storage.ports,
197 fff8bd58 Kostas Papadimitriou
          collectionFilter: function(m) {
198 fff8bd58 Kostas Papadimitriou
            return m.get('network') && m.get('network').get('is_public');
199 fff8bd58 Kostas Papadimitriou
          }
200 fff8bd58 Kostas Papadimitriou
        });
201 fff8bd58 Kostas Papadimitriou
        this.set({ports: this.ports});
202 fff8bd58 Kostas Papadimitriou
      },
203 fff8bd58 Kostas Papadimitriou
204 fff8bd58 Kostas Papadimitriou
    })
205 fff8bd58 Kostas Papadimitriou
206 fff8bd58 Kostas Papadimitriou
    models.Networks = models.NetworkCollection.extend({
207 fff8bd58 Kostas Papadimitriou
      model: models.Network,
208 fff8bd58 Kostas Papadimitriou
      path: 'networks',
209 fff8bd58 Kostas Papadimitriou
      details: true,
210 fff8bd58 Kostas Papadimitriou
      parse: function(resp) {
211 fff8bd58 Kostas Papadimitriou
        return resp.networks
212 fff8bd58 Kostas Papadimitriou
      },
213 fff8bd58 Kostas Papadimitriou
214 fff8bd58 Kostas Papadimitriou
      get_floating_ips_network: function() {
215 fff8bd58 Kostas Papadimitriou
        return this.filter(function(n) { return n.get('is_public')})[1]
216 fff8bd58 Kostas Papadimitriou
      },
217 fff8bd58 Kostas Papadimitriou
218 fff8bd58 Kostas Papadimitriou
      create: function (name, type, cidr, dhcp, callback) {
219 fff8bd58 Kostas Papadimitriou
        var quota = synnefo.storage.quotas;
220 fff8bd58 Kostas Papadimitriou
        var params = { network: { name:name } };
221 fff8bd58 Kostas Papadimitriou
        if (!type) { throw "Network type cannot be empty"; }
222 fff8bd58 Kostas Papadimitriou
223 fff8bd58 Kostas Papadimitriou
        params.network.type = type;
224 fff8bd58 Kostas Papadimitriou
        if (cidr) { params.network.cidr = cidr; }
225 fff8bd58 Kostas Papadimitriou
        if (dhcp) { params.network.dhcp = dhcp; }
226 fff8bd58 Kostas Papadimitriou
        if (dhcp === false) { params.network.dhcp = false; }
227 fff8bd58 Kostas Papadimitriou
        
228 fff8bd58 Kostas Papadimitriou
        var cb = function() {
229 fff8bd58 Kostas Papadimitriou
          callback();
230 fff8bd58 Kostas Papadimitriou
          quota.get('cyclades.network.private').increase();
231 fff8bd58 Kostas Papadimitriou
        }
232 fff8bd58 Kostas Papadimitriou
        return this.api_call(this.path, "create", params, cb);
233 fff8bd58 Kostas Papadimitriou
      }
234 fff8bd58 Kostas Papadimitriou
    });
235 fff8bd58 Kostas Papadimitriou
236 fff8bd58 Kostas Papadimitriou
    models.Port = models.NetworkModel.extend({
237 fff8bd58 Kostas Papadimitriou
      
238 fff8bd58 Kostas Papadimitriou
      path: 'ports',
239 fff8bd58 Kostas Papadimitriou
240 fff8bd58 Kostas Papadimitriou
      initialize: function() {
241 fff8bd58 Kostas Papadimitriou
        models.Port.__super__.initialize.apply(this, arguments);
242 fff8bd58 Kostas Papadimitriou
        this.set({'pending_firewall': null});
243 fff8bd58 Kostas Papadimitriou
      },
244 fff8bd58 Kostas Papadimitriou
      
245 fff8bd58 Kostas Papadimitriou
      model_actions: {
246 fff8bd58 Kostas Papadimitriou
        'disconnect': [['status', 'network', 'vm'], function() {
247 fff8bd58 Kostas Papadimitriou
          var network = this.get('network');
248 fff8bd58 Kostas Papadimitriou
          if (!network || network.is_public()) {
249 fff8bd58 Kostas Papadimitriou
            return false
250 fff8bd58 Kostas Papadimitriou
          }
251 fff8bd58 Kostas Papadimitriou
          var status_ok = _.contains(['DOWN', 'ACTIVE', 'CONNECTED'], 
252 fff8bd58 Kostas Papadimitriou
                                     this.get('status'));
253 fff8bd58 Kostas Papadimitriou
          var vm_status_ok = this.get('vm') && !this.get('vm').get('busy');
254 fff8bd58 Kostas Papadimitriou
          return status_ok && vm_status_ok
255 fff8bd58 Kostas Papadimitriou
        }]
256 fff8bd58 Kostas Papadimitriou
      },
257 fff8bd58 Kostas Papadimitriou
258 fff8bd58 Kostas Papadimitriou
      storage_attrs: {
259 fff8bd58 Kostas Papadimitriou
        'device_id': ['vms', 'vm'],
260 fff8bd58 Kostas Papadimitriou
        'network_id': ['networks', 'network'],
261 fff8bd58 Kostas Papadimitriou
      },
262 fff8bd58 Kostas Papadimitriou
263 fff8bd58 Kostas Papadimitriou
      proxy_attrs: {
264 fff8bd58 Kostas Papadimitriou
        'firewall_status': [
265 fff8bd58 Kostas Papadimitriou
          ['vm'], function(vm) {
266 fff8bd58 Kostas Papadimitriou
            var attachment = vm && vm.get_attachment(this.id);
267 fff8bd58 Kostas Papadimitriou
            if (!attachment) { return "DISABLED" }
268 fff8bd58 Kostas Papadimitriou
            return attachment.firewallProfile
269 fff8bd58 Kostas Papadimitriou
          } 
270 fff8bd58 Kostas Papadimitriou
        ],
271 fff8bd58 Kostas Papadimitriou
272 fff8bd58 Kostas Papadimitriou
        'firewall_running': [
273 fff8bd58 Kostas Papadimitriou
          ['firewall_status', 'pending_firewall'], function(status, pending) {
274 fff8bd58 Kostas Papadimitriou
              var pending = this.get('pending_firewall');
275 fff8bd58 Kostas Papadimitriou
              var status = this.get('firewall_status');
276 fff8bd58 Kostas Papadimitriou
              if (!pending) { return false }
277 fff8bd58 Kostas Papadimitriou
              if (status == pending) {
278 fff8bd58 Kostas Papadimitriou
                this.set({'pending_firewall': null});
279 fff8bd58 Kostas Papadimitriou
              }
280 fff8bd58 Kostas Papadimitriou
              return status != pending;
281 fff8bd58 Kostas Papadimitriou
          }
282 fff8bd58 Kostas Papadimitriou
        ],
283 fff8bd58 Kostas Papadimitriou
      },
284 fff8bd58 Kostas Papadimitriou
285 fff8bd58 Kostas Papadimitriou
      set_firewall: function(value, callback, error, options) {
286 fff8bd58 Kostas Papadimitriou
        // MOCK CALL
287 fff8bd58 Kostas Papadimitriou
        window.setTimeout(_.bind(function() {
288 fff8bd58 Kostas Papadimitriou
          var vm = this.get('vm');
289 fff8bd58 Kostas Papadimitriou
          var attachments = [];
290 fff8bd58 Kostas Papadimitriou
          attachments.push({id: this.id, firewallProfile: value});
291 fff8bd58 Kostas Papadimitriou
          vm.set({attachments: attachments});
292 fff8bd58 Kostas Papadimitriou
        }, this),  2000);
293 fff8bd58 Kostas Papadimitriou
        window.setTimeout(_.bind(function() {
294 fff8bd58 Kostas Papadimitriou
          callback();
295 fff8bd58 Kostas Papadimitriou
        }), 300);
296 fff8bd58 Kostas Papadimitriou
      },
297 fff8bd58 Kostas Papadimitriou
298 fff8bd58 Kostas Papadimitriou
      disconnect: function(cb) {
299 fff8bd58 Kostas Papadimitriou
        var network = this.get('network');
300 fff8bd58 Kostas Papadimitriou
        network.pending_disconnects++;
301 fff8bd58 Kostas Papadimitriou
        network.update_connecting_status();
302 fff8bd58 Kostas Papadimitriou
        this.destroy({complete: cb, silent: true});
303 fff8bd58 Kostas Papadimitriou
      }
304 fff8bd58 Kostas Papadimitriou
    });
305 fff8bd58 Kostas Papadimitriou
306 fff8bd58 Kostas Papadimitriou
    models.Ports = models.NetworkCollection.extend({
307 fff8bd58 Kostas Papadimitriou
      model: models.Port,
308 fff8bd58 Kostas Papadimitriou
      path: 'ports',
309 fff8bd58 Kostas Papadimitriou
      details: true,
310 fff8bd58 Kostas Papadimitriou
      noUpdate: true,
311 fff8bd58 Kostas Papadimitriou
      updateEntries: true,
312 fff8bd58 Kostas Papadimitriou
313 fff8bd58 Kostas Papadimitriou
      parse: function(data) {
314 fff8bd58 Kostas Papadimitriou
        return data.ports;
315 fff8bd58 Kostas Papadimitriou
      },
316 fff8bd58 Kostas Papadimitriou
317 fff8bd58 Kostas Papadimitriou
      comparator: function(m) {
318 fff8bd58 Kostas Papadimitriou
        try {
319 fff8bd58 Kostas Papadimitriou
          return parseInt(m.get('device_id'));
320 fff8bd58 Kostas Papadimitriou
        } catch (err) {
321 fff8bd58 Kostas Papadimitriou
          return 0
322 fff8bd58 Kostas Papadimitriou
        }
323 fff8bd58 Kostas Papadimitriou
      }
324 fff8bd58 Kostas Papadimitriou
    });
325 fff8bd58 Kostas Papadimitriou
326 fff8bd58 Kostas Papadimitriou
    models.FloatingIP = models.NetworkModel.extend({
327 fff8bd58 Kostas Papadimitriou
      path: 'floatingips',
328 fff8bd58 Kostas Papadimitriou
      storage_attrs: {
329 fff8bd58 Kostas Papadimitriou
        'port_id': ['ports', 'port'],
330 fff8bd58 Kostas Papadimitriou
        'floating_network_id': ['networks', 'network'],
331 fff8bd58 Kostas Papadimitriou
      },
332 fff8bd58 Kostas Papadimitriou
333 fff8bd58 Kostas Papadimitriou
      model_actions: {
334 fff8bd58 Kostas Papadimitriou
        'remove': [['status'], function() {
335 fff8bd58 Kostas Papadimitriou
          var status_ok = _.contains(['DISCONNECTED'], this.get('status'))
336 fff8bd58 Kostas Papadimitriou
          return status_ok
337 fff8bd58 Kostas Papadimitriou
        }],
338 fff8bd58 Kostas Papadimitriou
        'connect': [['status'], function() {
339 fff8bd58 Kostas Papadimitriou
          var status_ok = _.contains(['DISCONNECTED'], this.get('status'))
340 fff8bd58 Kostas Papadimitriou
          return status_ok
341 fff8bd58 Kostas Papadimitriou
        }],
342 fff8bd58 Kostas Papadimitriou
        'disconnect': [['status'], function() {
343 fff8bd58 Kostas Papadimitriou
          var status_ok = _.contains(['CONNECTED'], this.get('status'))
344 fff8bd58 Kostas Papadimitriou
          return status_ok
345 fff8bd58 Kostas Papadimitriou
        }]
346 fff8bd58 Kostas Papadimitriou
      },
347 fff8bd58 Kostas Papadimitriou
348 fff8bd58 Kostas Papadimitriou
      proxy_attrs: {
349 fff8bd58 Kostas Papadimitriou
        'ip': [
350 fff8bd58 Kostas Papadimitriou
          ['floating_ip_adress'], function() {
351 fff8bd58 Kostas Papadimitriou
            return this.get('floating_ip_address'); 
352 fff8bd58 Kostas Papadimitriou
        }],
353 fff8bd58 Kostas Papadimitriou
354 fff8bd58 Kostas Papadimitriou
        'in_progress': [
355 fff8bd58 Kostas Papadimitriou
          ['status'], function() {
356 fff8bd58 Kostas Papadimitriou
            return _.contains(['CONNECTING', 'DISCONNECTING', 'REMOVING'], 
357 fff8bd58 Kostas Papadimitriou
                              this.get('status'))
358 fff8bd58 Kostas Papadimitriou
          }  
359 fff8bd58 Kostas Papadimitriou
        ],
360 fff8bd58 Kostas Papadimitriou
361 fff8bd58 Kostas Papadimitriou
        'status': [
362 fff8bd58 Kostas Papadimitriou
          ['port_id', 'port'], function() {
363 fff8bd58 Kostas Papadimitriou
            var val = this.get('port_id');
364 fff8bd58 Kostas Papadimitriou
            if (!val) {
365 fff8bd58 Kostas Papadimitriou
              return 'DISCONNECTED'
366 fff8bd58 Kostas Papadimitriou
            } else {
367 fff8bd58 Kostas Papadimitriou
              if (this.get('port')) {
368 fff8bd58 Kostas Papadimitriou
                return 'CONNECTED'
369 fff8bd58 Kostas Papadimitriou
              } else {
370 fff8bd58 Kostas Papadimitriou
                return 'CONNECTING'
371 fff8bd58 Kostas Papadimitriou
              }
372 fff8bd58 Kostas Papadimitriou
            }
373 fff8bd58 Kostas Papadimitriou
          }
374 fff8bd58 Kostas Papadimitriou
        ]
375 fff8bd58 Kostas Papadimitriou
      },
376 fff8bd58 Kostas Papadimitriou
377 fff8bd58 Kostas Papadimitriou
      disconnect: function(cb) {
378 fff8bd58 Kostas Papadimitriou
        // MOCK
379 fff8bd58 Kostas Papadimitriou
        var self = this;
380 fff8bd58 Kostas Papadimitriou
        window.setTimeout(function() {
381 fff8bd58 Kostas Papadimitriou
          cb()
382 fff8bd58 Kostas Papadimitriou
        }, 2000);
383 fff8bd58 Kostas Papadimitriou
        window.setTimeout(function() {
384 fff8bd58 Kostas Papadimitriou
          self.set({port_id: undefined});
385 fff8bd58 Kostas Papadimitriou
        }, 3000);
386 fff8bd58 Kostas Papadimitriou
      }
387 fff8bd58 Kostas Papadimitriou
    });
388 fff8bd58 Kostas Papadimitriou
389 fff8bd58 Kostas Papadimitriou
    models.FloatingIPs = models.NetworkCollection.extend({
390 fff8bd58 Kostas Papadimitriou
      model: models.FloatingIP,
391 fff8bd58 Kostas Papadimitriou
      details: false,
392 fff8bd58 Kostas Papadimitriou
      path: 'floatingips',
393 fff8bd58 Kostas Papadimitriou
      parse: function(resp) {
394 fff8bd58 Kostas Papadimitriou
        return resp.floatingips;
395 fff8bd58 Kostas Papadimitriou
      }
396 fff8bd58 Kostas Papadimitriou
    });
397 fff8bd58 Kostas Papadimitriou
398 fff8bd58 Kostas Papadimitriou
    models.Router = models.NetworkModel.extend({
399 fff8bd58 Kostas Papadimitriou
    });
400 fff8bd58 Kostas Papadimitriou
401 fff8bd58 Kostas Papadimitriou
    models.Routers = models.NetworkCollection.extend({
402 fff8bd58 Kostas Papadimitriou
      model: models.Router,
403 fff8bd58 Kostas Papadimitriou
      path: 'routers',
404 fff8bd58 Kostas Papadimitriou
      parse: function(resp) {
405 fff8bd58 Kostas Papadimitriou
        return resp.routers
406 fff8bd58 Kostas Papadimitriou
      }
407 fff8bd58 Kostas Papadimitriou
    });
408 fff8bd58 Kostas Papadimitriou
409 fff8bd58 Kostas Papadimitriou
    snf.storage.floating_ips = new models.FloatingIPs();
410 fff8bd58 Kostas Papadimitriou
    snf.storage.routers = new models.Routers();
411 fff8bd58 Kostas Papadimitriou
    snf.storage.networks = new models.Networks();
412 fff8bd58 Kostas Papadimitriou
    snf.storage.ports = new models.Ports();
413 fff8bd58 Kostas Papadimitriou
    snf.storage.subnets = new models.Subnets();
414 fff8bd58 Kostas Papadimitriou
415 fff8bd58 Kostas Papadimitriou
})(this);