Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / ui / static / snf / js / neutron.js @ 27d628c4

History | View | Annotate | Download (14.2 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 e481c282 Kostas Papadimitriou
      api_type: 'network'
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 e481c282 Kostas Papadimitriou
      api_type: 'network',
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 d233867a Kostas Papadimitriou
        'cidr': [
72 d233867a Kostas Papadimitriou
          ['subnet'], function() {
73 d233867a Kostas Papadimitriou
            var subnet = this.get('subnet');
74 d233867a Kostas Papadimitriou
            if (subnet && subnet.get('cidr')) {
75 d233867a Kostas Papadimitriou
              return subnet.get('cidr')
76 d233867a Kostas Papadimitriou
            } else {
77 d233867a Kostas Papadimitriou
              return undefined
78 d233867a Kostas Papadimitriou
            }
79 d233867a Kostas Papadimitriou
          }
80 d233867a Kostas Papadimitriou
        ],
81 fff8bd58 Kostas Papadimitriou
        'ext_status': [
82 d233867a Kostas Papadimitriou
          ['status', 'cidr'], function(st) {
83 a681ab44 Kostas Papadimitriou
            if (this.get('ext_status') == 'REMOVING') {
84 a681ab44 Kostas Papadimitriou
              return 'REMOVING'
85 a681ab44 Kostas Papadimitriou
            }
86 fff8bd58 Kostas Papadimitriou
            if (this.pending_connections) {
87 fff8bd58 Kostas Papadimitriou
              return 'CONNECTING'
88 fff8bd58 Kostas Papadimitriou
            } else if (this.pending_disconnects) {
89 fff8bd58 Kostas Papadimitriou
              return 'DISCONNECTING'
90 fff8bd58 Kostas Papadimitriou
            } else {
91 d233867a Kostas Papadimitriou
              return this.get('status')
92 fff8bd58 Kostas Papadimitriou
            }
93 fff8bd58 Kostas Papadimitriou
        }],
94 fff8bd58 Kostas Papadimitriou
        'in_progress': [
95 fff8bd58 Kostas Papadimitriou
          ['ext_status'], function() {
96 fff8bd58 Kostas Papadimitriou
            return _.contains(['CONNECTING', 
97 fff8bd58 Kostas Papadimitriou
                               'DISCONNECTING', 
98 fff8bd58 Kostas Papadimitriou
                               'REMOVING'], 
99 fff8bd58 Kostas Papadimitriou
                               this.get('ext_status'))
100 fff8bd58 Kostas Papadimitriou
          }  
101 fff8bd58 Kostas Papadimitriou
        ]
102 fff8bd58 Kostas Papadimitriou
      },
103 fff8bd58 Kostas Papadimitriou
      
104 d233867a Kostas Papadimitriou
      storage_attrs: {
105 d233867a Kostas Papadimitriou
        'subnets': ['subnets', 'subnet', function(model, attr) {
106 d233867a Kostas Papadimitriou
          var subnets = model.get(attr);
107 c68ad72e Kostas Papadimitriou
          if (subnets && subnets.length) { return subnets[0] }
108 d233867a Kostas Papadimitriou
        }]
109 d233867a Kostas Papadimitriou
      },
110 d233867a Kostas Papadimitriou
111 fff8bd58 Kostas Papadimitriou
      // call rename api
112 fff8bd58 Kostas Papadimitriou
      rename: function(new_name, cb) {
113 fff8bd58 Kostas Papadimitriou
          this.sync("update", this, {
114 fff8bd58 Kostas Papadimitriou
              critical: true,
115 fff8bd58 Kostas Papadimitriou
              data: {
116 fff8bd58 Kostas Papadimitriou
                  'network': {
117 fff8bd58 Kostas Papadimitriou
                      'name': new_name
118 fff8bd58 Kostas Papadimitriou
                  }
119 fff8bd58 Kostas Papadimitriou
              }, 
120 fff8bd58 Kostas Papadimitriou
              // do the rename after the method succeeds
121 fff8bd58 Kostas Papadimitriou
              success: _.bind(function(){
122 fff8bd58 Kostas Papadimitriou
                  //this.set({name: new_name});
123 fff8bd58 Kostas Papadimitriou
                  snf.api.trigger("call");
124 fff8bd58 Kostas Papadimitriou
              }, this),
125 fff8bd58 Kostas Papadimitriou
              complete: cb || function() {}
126 fff8bd58 Kostas Papadimitriou
          });
127 fff8bd58 Kostas Papadimitriou
      },
128 fff8bd58 Kostas Papadimitriou
129 fff8bd58 Kostas Papadimitriou
      pending_connections: 0,
130 fff8bd58 Kostas Papadimitriou
      pending_disconnects: 0,
131 fff8bd58 Kostas Papadimitriou
132 fff8bd58 Kostas Papadimitriou
      initialize: function() {
133 fff8bd58 Kostas Papadimitriou
        var self = this;
134 fff8bd58 Kostas Papadimitriou
        this.subnets = new Backbone.FilteredCollection(undefined, {
135 fff8bd58 Kostas Papadimitriou
          collection: synnefo.storage.subnets,
136 fff8bd58 Kostas Papadimitriou
          collectionFilter: function(m) {
137 fff8bd58 Kostas Papadimitriou
            return self.id == m.get('network_id')
138 d233867a Kostas Papadimitriou
        }});
139 d233867a Kostas Papadimitriou
        models.Network.__super__.initialize.apply(this, arguments);
140 fff8bd58 Kostas Papadimitriou
        this.ports = new Backbone.FilteredCollection(undefined, {
141 fff8bd58 Kostas Papadimitriou
          collection: synnefo.storage.ports,
142 fff8bd58 Kostas Papadimitriou
          collectionFilter: function(m) {
143 fff8bd58 Kostas Papadimitriou
            return self.id == m.get('network_id')
144 fff8bd58 Kostas Papadimitriou
          }
145 fff8bd58 Kostas Papadimitriou
        });
146 fff8bd58 Kostas Papadimitriou
        this.ports.network = this;
147 fff8bd58 Kostas Papadimitriou
        this.ports.bind("add", function() {
148 fff8bd58 Kostas Papadimitriou
          this.pending_connections--;
149 fff8bd58 Kostas Papadimitriou
          this.update_connecting_status();
150 fff8bd58 Kostas Papadimitriou
        }, this);
151 fff8bd58 Kostas Papadimitriou
        this.ports.bind("remove", function() {
152 fff8bd58 Kostas Papadimitriou
          this.pending_disconnects--;
153 fff8bd58 Kostas Papadimitriou
          this.update_connecting_status();
154 fff8bd58 Kostas Papadimitriou
        }, this);
155 fff8bd58 Kostas Papadimitriou
        this.set({ports: this.ports});
156 fff8bd58 Kostas Papadimitriou
      },
157 fff8bd58 Kostas Papadimitriou
      
158 fff8bd58 Kostas Papadimitriou
      update_connecting_status: function() {
159 fff8bd58 Kostas Papadimitriou
        if (this.pending_connections <= 0) {
160 fff8bd58 Kostas Papadimitriou
          this.pending_connections = 0;
161 fff8bd58 Kostas Papadimitriou
        }
162 fff8bd58 Kostas Papadimitriou
        if (this.pending_disconnects <= 0) {
163 fff8bd58 Kostas Papadimitriou
          this.pending_disconnects = 0;
164 fff8bd58 Kostas Papadimitriou
        }
165 fff8bd58 Kostas Papadimitriou
        this.trigger('change:status', this.get('status'));
166 fff8bd58 Kostas Papadimitriou
      },
167 fff8bd58 Kostas Papadimitriou
168 fff8bd58 Kostas Papadimitriou
      get_nics: function() {
169 fff8bd58 Kostas Papadimitriou
        return this.nics.models
170 fff8bd58 Kostas Papadimitriou
      },
171 fff8bd58 Kostas Papadimitriou
172 fff8bd58 Kostas Papadimitriou
      is_public: function() {
173 fff8bd58 Kostas Papadimitriou
        return this.get('router:external')
174 fff8bd58 Kostas Papadimitriou
      },
175 fff8bd58 Kostas Papadimitriou
176 fff8bd58 Kostas Papadimitriou
      pluggable_vms: function() {
177 fff8bd58 Kostas Papadimitriou
        var vms = synnefo.storage.vms.models;
178 fff8bd58 Kostas Papadimitriou
        // TODO: filter out vms
179 fff8bd58 Kostas Papadimitriou
        return vms;
180 fff8bd58 Kostas Papadimitriou
      },
181 e38e7fcf Kostas Papadimitriou
      
182 fff8bd58 Kostas Papadimitriou
      connect_vm: function(vm, cb) {
183 fff8bd58 Kostas Papadimitriou
        var self = this;
184 fff8bd58 Kostas Papadimitriou
        var data = {
185 fff8bd58 Kostas Papadimitriou
          port: {
186 fff8bd58 Kostas Papadimitriou
            network_id: this.id,
187 fff8bd58 Kostas Papadimitriou
            device_id: vm.id
188 fff8bd58 Kostas Papadimitriou
          }
189 fff8bd58 Kostas Papadimitriou
        }
190 fff8bd58 Kostas Papadimitriou
191 fff8bd58 Kostas Papadimitriou
        this.pending_connections++;
192 fff8bd58 Kostas Papadimitriou
        this.update_connecting_status();
193 fff8bd58 Kostas Papadimitriou
        synnefo.storage.ports.create(data, {complete: cb});
194 fff8bd58 Kostas Papadimitriou
      }
195 fff8bd58 Kostas Papadimitriou
    });
196 fff8bd58 Kostas Papadimitriou
197 fff8bd58 Kostas Papadimitriou
    models.CombinedPublicNetwork = models.Network.extend({
198 fff8bd58 Kostas Papadimitriou
      defaults: {
199 fff8bd58 Kostas Papadimitriou
        'admin_state_up': true,
200 fff8bd58 Kostas Papadimitriou
        'id': 'snf-combined-public-network',
201 fff8bd58 Kostas Papadimitriou
        'name': 'Public',
202 fff8bd58 Kostas Papadimitriou
        'status': 'ACTIVE',
203 fff8bd58 Kostas Papadimitriou
        'router:external': true,
204 fff8bd58 Kostas Papadimitriou
        'shared': false,
205 d233867a Kostas Papadimitriou
        'rename_disabled': true,
206 d233867a Kostas Papadimitriou
        'subnets': []
207 fff8bd58 Kostas Papadimitriou
      },
208 fff8bd58 Kostas Papadimitriou
      
209 fff8bd58 Kostas Papadimitriou
      initialize: function() {
210 fff8bd58 Kostas Papadimitriou
        models.Network.__super__.initialize.apply(this, arguments);
211 fff8bd58 Kostas Papadimitriou
        var self = this;
212 fff8bd58 Kostas Papadimitriou
        this.ports = new Backbone.FilteredCollection(undefined, {
213 fff8bd58 Kostas Papadimitriou
          collection: synnefo.storage.ports,
214 fff8bd58 Kostas Papadimitriou
          collectionFilter: function(m) {
215 fff8bd58 Kostas Papadimitriou
            return m.get('network') && m.get('network').get('is_public');
216 fff8bd58 Kostas Papadimitriou
          }
217 fff8bd58 Kostas Papadimitriou
        });
218 fff8bd58 Kostas Papadimitriou
        this.set({ports: this.ports});
219 c68ad72e Kostas Papadimitriou
        this.floating_ips = synnefo.storage.floating_ips;
220 c68ad72e Kostas Papadimitriou
        this.set({floating_ips: this.floating_ips});
221 c68ad72e Kostas Papadimitriou
222 c68ad72e Kostas Papadimitriou
        this.available_floating_ips = new Backbone.FilteredCollection(undefined, {
223 c68ad72e Kostas Papadimitriou
          collection: synnefo.storage.floating_ips,
224 c68ad72e Kostas Papadimitriou
          collectionFilter: function(m) {
225 c68ad72e Kostas Papadimitriou
            return !m.get('port_id');
226 c68ad72e Kostas Papadimitriou
          }
227 c68ad72e Kostas Papadimitriou
        });
228 c68ad72e Kostas Papadimitriou
        this.set({available_floating_ips: this.available_floating_ips});
229 fff8bd58 Kostas Papadimitriou
      },
230 fff8bd58 Kostas Papadimitriou
231 fff8bd58 Kostas Papadimitriou
    })
232 fff8bd58 Kostas Papadimitriou
233 fff8bd58 Kostas Papadimitriou
    models.Networks = models.NetworkCollection.extend({
234 fff8bd58 Kostas Papadimitriou
      model: models.Network,
235 fff8bd58 Kostas Papadimitriou
      path: 'networks',
236 fff8bd58 Kostas Papadimitriou
      details: true,
237 fff8bd58 Kostas Papadimitriou
      parse: function(resp) {
238 fff8bd58 Kostas Papadimitriou
        return resp.networks
239 fff8bd58 Kostas Papadimitriou
      },
240 fff8bd58 Kostas Papadimitriou
241 fff8bd58 Kostas Papadimitriou
      get_floating_ips_network: function() {
242 fff8bd58 Kostas Papadimitriou
        return this.filter(function(n) { return n.get('is_public')})[1]
243 fff8bd58 Kostas Papadimitriou
      },
244 fff8bd58 Kostas Papadimitriou
245 fff8bd58 Kostas Papadimitriou
      create: function (name, type, cidr, dhcp, callback) {
246 fff8bd58 Kostas Papadimitriou
        var quota = synnefo.storage.quotas;
247 e38e7fcf Kostas Papadimitriou
        var params = {network:{name:name}};
248 e38e7fcf Kostas Papadimitriou
        var subnet_params = {subnet:{network_id:undefined}};
249 fff8bd58 Kostas Papadimitriou
        if (!type) { throw "Network type cannot be empty"; }
250 fff8bd58 Kostas Papadimitriou
251 fff8bd58 Kostas Papadimitriou
        params.network.type = type;
252 e38e7fcf Kostas Papadimitriou
        if (cidr) { subnet_params.subnet.cidr = cidr; }
253 e38e7fcf Kostas Papadimitriou
        if (dhcp) { subnet_params.subnet.dhcp_enabled = dhcp; }
254 e38e7fcf Kostas Papadimitriou
        if (dhcp === false) { subnet_params.subnet.dhcp_enabled = false; }
255 fff8bd58 Kostas Papadimitriou
        
256 fff8bd58 Kostas Papadimitriou
        var cb = function() {
257 fff8bd58 Kostas Papadimitriou
          callback();
258 e38e7fcf Kostas Papadimitriou
        }
259 e38e7fcf Kostas Papadimitriou
        
260 e38e7fcf Kostas Papadimitriou
        var complete = function() {};
261 e38e7fcf Kostas Papadimitriou
        var error = function() { cb() };
262 e38e7fcf Kostas Papadimitriou
        // on network create success, try to create the requested 
263 e38e7fcf Kostas Papadimitriou
        // network subnet
264 e38e7fcf Kostas Papadimitriou
        var success = function(resp) {
265 e38e7fcf Kostas Papadimitriou
          var network = resp.network;
266 e38e7fcf Kostas Papadimitriou
          subnet_params.subnet.network_id = network.id;
267 e38e7fcf Kostas Papadimitriou
          synnefo.storage.subnets.create(subnet_params, {
268 e38e7fcf Kostas Papadimitriou
            complete: function () { cb && cb() }
269 e38e7fcf Kostas Papadimitriou
          });
270 fff8bd58 Kostas Papadimitriou
          quota.get('cyclades.network.private').increase();
271 fff8bd58 Kostas Papadimitriou
        }
272 e38e7fcf Kostas Papadimitriou
        return this.api_call(this.path, "create", params, complete, error, success);
273 fff8bd58 Kostas Papadimitriou
      }
274 fff8bd58 Kostas Papadimitriou
    });
275 365af933 Kostas Papadimitriou
    
276 365af933 Kostas Papadimitriou
    // dummy model/collection
277 365af933 Kostas Papadimitriou
    models.FixedIP = models.NetworkModel.extend({
278 365af933 Kostas Papadimitriou
      storage_attrs: {
279 365af933 Kostas Papadimitriou
        'subnet_id': ['subnets', 'subnet']
280 365af933 Kostas Papadimitriou
      }
281 365af933 Kostas Papadimitriou
    });
282 365af933 Kostas Papadimitriou
    models.FixedIPs = models.NetworkCollection.extend({
283 365af933 Kostas Papadimitriou
      model: models.FixedIP
284 365af933 Kostas Papadimitriou
    });
285 fff8bd58 Kostas Papadimitriou
286 fff8bd58 Kostas Papadimitriou
    models.Port = models.NetworkModel.extend({
287 fff8bd58 Kostas Papadimitriou
      path: 'ports',
288 fff8bd58 Kostas Papadimitriou
      initialize: function() {
289 fff8bd58 Kostas Papadimitriou
        models.Port.__super__.initialize.apply(this, arguments);
290 365af933 Kostas Papadimitriou
        var ips = new models.FixedIPs();
291 365af933 Kostas Papadimitriou
        this.set({'ips': ips});
292 365af933 Kostas Papadimitriou
        this.bind('change:fixed_ips', function() {
293 365af933 Kostas Papadimitriou
          var ips = this.get('ips');
294 365af933 Kostas Papadimitriou
          //var ips = _.map(ips, function(ip) { ip.id = ip.a})
295 365af933 Kostas Papadimitriou
          this.update_ips()
296 365af933 Kostas Papadimitriou
        }, this);
297 365af933 Kostas Papadimitriou
        this.update_ips();
298 fff8bd58 Kostas Papadimitriou
        this.set({'pending_firewall': null});
299 fff8bd58 Kostas Papadimitriou
      },
300 fff8bd58 Kostas Papadimitriou
      
301 365af933 Kostas Papadimitriou
      update_ips: function() {
302 32a58fdf Kostas Papadimitriou
        var ips = _.map(this.get('fixed_ips'), function(ip_obj) {
303 32a58fdf Kostas Papadimitriou
          var ip = _.clone(ip_obj);
304 365af933 Kostas Papadimitriou
          var type = "v4";
305 365af933 Kostas Papadimitriou
          if (ip.ip_address.indexOf(":") >= 0) {
306 365af933 Kostas Papadimitriou
            type = "v6";
307 365af933 Kostas Papadimitriou
          }
308 365af933 Kostas Papadimitriou
          ip.id = ip.ip_address;
309 365af933 Kostas Papadimitriou
          ip.type = type;
310 365af933 Kostas Papadimitriou
          ip.subnet_id = ip.subnet;
311 365af933 Kostas Papadimitriou
          delete ip.subnet;
312 365af933 Kostas Papadimitriou
          return ip;
313 365af933 Kostas Papadimitriou
        });
314 365af933 Kostas Papadimitriou
        this.get('ips').update(ips, {removeMissing: true});
315 365af933 Kostas Papadimitriou
      },
316 365af933 Kostas Papadimitriou
317 fff8bd58 Kostas Papadimitriou
      model_actions: {
318 fff8bd58 Kostas Papadimitriou
        'disconnect': [['status', 'network', 'vm'], function() {
319 fff8bd58 Kostas Papadimitriou
          var network = this.get('network');
320 fff8bd58 Kostas Papadimitriou
          if (!network || network.is_public()) {
321 fff8bd58 Kostas Papadimitriou
            return false
322 fff8bd58 Kostas Papadimitriou
          }
323 fff8bd58 Kostas Papadimitriou
          var status_ok = _.contains(['DOWN', 'ACTIVE', 'CONNECTED'], 
324 fff8bd58 Kostas Papadimitriou
                                     this.get('status'));
325 fff8bd58 Kostas Papadimitriou
          var vm_status_ok = this.get('vm') && !this.get('vm').get('busy');
326 fff8bd58 Kostas Papadimitriou
          return status_ok && vm_status_ok
327 fff8bd58 Kostas Papadimitriou
        }]
328 fff8bd58 Kostas Papadimitriou
      },
329 fff8bd58 Kostas Papadimitriou
330 fff8bd58 Kostas Papadimitriou
      storage_attrs: {
331 fff8bd58 Kostas Papadimitriou
        'device_id': ['vms', 'vm'],
332 32a58fdf Kostas Papadimitriou
        'network_id': ['networks', 'network']
333 fff8bd58 Kostas Papadimitriou
      },
334 fff8bd58 Kostas Papadimitriou
335 fff8bd58 Kostas Papadimitriou
      proxy_attrs: {
336 fff8bd58 Kostas Papadimitriou
        'firewall_status': [
337 fff8bd58 Kostas Papadimitriou
          ['vm'], function(vm) {
338 fff8bd58 Kostas Papadimitriou
            var attachment = vm && vm.get_attachment(this.id);
339 fff8bd58 Kostas Papadimitriou
            if (!attachment) { return "DISABLED" }
340 fff8bd58 Kostas Papadimitriou
            return attachment.firewallProfile
341 fff8bd58 Kostas Papadimitriou
          } 
342 fff8bd58 Kostas Papadimitriou
        ],
343 365af933 Kostas Papadimitriou
        
344 fff8bd58 Kostas Papadimitriou
        'firewall_running': [
345 fff8bd58 Kostas Papadimitriou
          ['firewall_status', 'pending_firewall'], function(status, pending) {
346 fff8bd58 Kostas Papadimitriou
              var pending = this.get('pending_firewall');
347 fff8bd58 Kostas Papadimitriou
              var status = this.get('firewall_status');
348 fff8bd58 Kostas Papadimitriou
              if (!pending) { return false }
349 fff8bd58 Kostas Papadimitriou
              if (status == pending) {
350 fff8bd58 Kostas Papadimitriou
                this.set({'pending_firewall': null});
351 fff8bd58 Kostas Papadimitriou
              }
352 fff8bd58 Kostas Papadimitriou
              return status != pending;
353 fff8bd58 Kostas Papadimitriou
          }
354 fff8bd58 Kostas Papadimitriou
        ],
355 fff8bd58 Kostas Papadimitriou
      },
356 fff8bd58 Kostas Papadimitriou
357 fff8bd58 Kostas Papadimitriou
      set_firewall: function(value, callback, error, options) {
358 fff8bd58 Kostas Papadimitriou
        // MOCK CALL
359 fff8bd58 Kostas Papadimitriou
        window.setTimeout(_.bind(function() {
360 fff8bd58 Kostas Papadimitriou
          var vm = this.get('vm');
361 fff8bd58 Kostas Papadimitriou
          var attachments = [];
362 fff8bd58 Kostas Papadimitriou
          attachments.push({id: this.id, firewallProfile: value});
363 fff8bd58 Kostas Papadimitriou
          vm.set({attachments: attachments});
364 fff8bd58 Kostas Papadimitriou
        }, this),  2000);
365 fff8bd58 Kostas Papadimitriou
        window.setTimeout(_.bind(function() {
366 fff8bd58 Kostas Papadimitriou
          callback();
367 fff8bd58 Kostas Papadimitriou
        }), 300);
368 fff8bd58 Kostas Papadimitriou
      },
369 fff8bd58 Kostas Papadimitriou
370 fff8bd58 Kostas Papadimitriou
      disconnect: function(cb) {
371 fff8bd58 Kostas Papadimitriou
        var network = this.get('network');
372 fff8bd58 Kostas Papadimitriou
        network.pending_disconnects++;
373 fff8bd58 Kostas Papadimitriou
        network.update_connecting_status();
374 fff8bd58 Kostas Papadimitriou
        this.destroy({complete: cb, silent: true});
375 fff8bd58 Kostas Papadimitriou
      }
376 fff8bd58 Kostas Papadimitriou
    });
377 fff8bd58 Kostas Papadimitriou
378 fff8bd58 Kostas Papadimitriou
    models.Ports = models.NetworkCollection.extend({
379 fff8bd58 Kostas Papadimitriou
      model: models.Port,
380 fff8bd58 Kostas Papadimitriou
      path: 'ports',
381 fff8bd58 Kostas Papadimitriou
      details: true,
382 fff8bd58 Kostas Papadimitriou
      noUpdate: true,
383 fff8bd58 Kostas Papadimitriou
      updateEntries: true,
384 fff8bd58 Kostas Papadimitriou
385 fff8bd58 Kostas Papadimitriou
      parse: function(data) {
386 fff8bd58 Kostas Papadimitriou
        return data.ports;
387 fff8bd58 Kostas Papadimitriou
      },
388 fff8bd58 Kostas Papadimitriou
389 fff8bd58 Kostas Papadimitriou
      comparator: function(m) {
390 fff8bd58 Kostas Papadimitriou
        try {
391 fff8bd58 Kostas Papadimitriou
          return parseInt(m.get('device_id'));
392 fff8bd58 Kostas Papadimitriou
        } catch (err) {
393 fff8bd58 Kostas Papadimitriou
          return 0
394 fff8bd58 Kostas Papadimitriou
        }
395 fff8bd58 Kostas Papadimitriou
      }
396 fff8bd58 Kostas Papadimitriou
    });
397 fff8bd58 Kostas Papadimitriou
398 fff8bd58 Kostas Papadimitriou
    models.FloatingIP = models.NetworkModel.extend({
399 fff8bd58 Kostas Papadimitriou
      path: 'floatingips',
400 fff8bd58 Kostas Papadimitriou
      storage_attrs: {
401 fff8bd58 Kostas Papadimitriou
        'port_id': ['ports', 'port'],
402 fff8bd58 Kostas Papadimitriou
        'floating_network_id': ['networks', 'network'],
403 fff8bd58 Kostas Papadimitriou
      },
404 fff8bd58 Kostas Papadimitriou
405 fff8bd58 Kostas Papadimitriou
      model_actions: {
406 fff8bd58 Kostas Papadimitriou
        'remove': [['status'], function() {
407 fff8bd58 Kostas Papadimitriou
          var status_ok = _.contains(['DISCONNECTED'], this.get('status'))
408 fff8bd58 Kostas Papadimitriou
          return status_ok
409 fff8bd58 Kostas Papadimitriou
        }],
410 fff8bd58 Kostas Papadimitriou
        'connect': [['status'], function() {
411 fff8bd58 Kostas Papadimitriou
          var status_ok = _.contains(['DISCONNECTED'], this.get('status'))
412 fff8bd58 Kostas Papadimitriou
          return status_ok
413 fff8bd58 Kostas Papadimitriou
        }],
414 fff8bd58 Kostas Papadimitriou
        'disconnect': [['status'], function() {
415 fff8bd58 Kostas Papadimitriou
          var status_ok = _.contains(['CONNECTED'], this.get('status'))
416 fff8bd58 Kostas Papadimitriou
          return status_ok
417 fff8bd58 Kostas Papadimitriou
        }]
418 fff8bd58 Kostas Papadimitriou
      },
419 fff8bd58 Kostas Papadimitriou
420 fff8bd58 Kostas Papadimitriou
      proxy_attrs: {
421 fff8bd58 Kostas Papadimitriou
        'ip': [
422 fff8bd58 Kostas Papadimitriou
          ['floating_ip_adress'], function() {
423 fff8bd58 Kostas Papadimitriou
            return this.get('floating_ip_address'); 
424 fff8bd58 Kostas Papadimitriou
        }],
425 fff8bd58 Kostas Papadimitriou
426 fff8bd58 Kostas Papadimitriou
        'in_progress': [
427 fff8bd58 Kostas Papadimitriou
          ['status'], function() {
428 fff8bd58 Kostas Papadimitriou
            return _.contains(['CONNECTING', 'DISCONNECTING', 'REMOVING'], 
429 fff8bd58 Kostas Papadimitriou
                              this.get('status'))
430 fff8bd58 Kostas Papadimitriou
          }  
431 fff8bd58 Kostas Papadimitriou
        ],
432 fff8bd58 Kostas Papadimitriou
433 fff8bd58 Kostas Papadimitriou
        'status': [
434 fff8bd58 Kostas Papadimitriou
          ['port_id', 'port'], function() {
435 fff8bd58 Kostas Papadimitriou
            var val = this.get('port_id');
436 fff8bd58 Kostas Papadimitriou
            if (!val) {
437 fff8bd58 Kostas Papadimitriou
              return 'DISCONNECTED'
438 fff8bd58 Kostas Papadimitriou
            } else {
439 fff8bd58 Kostas Papadimitriou
              if (this.get('port')) {
440 fff8bd58 Kostas Papadimitriou
                return 'CONNECTED'
441 fff8bd58 Kostas Papadimitriou
              } else {
442 fff8bd58 Kostas Papadimitriou
                return 'CONNECTING'
443 fff8bd58 Kostas Papadimitriou
              }
444 fff8bd58 Kostas Papadimitriou
            }
445 fff8bd58 Kostas Papadimitriou
          }
446 fff8bd58 Kostas Papadimitriou
        ]
447 fff8bd58 Kostas Papadimitriou
      },
448 fff8bd58 Kostas Papadimitriou
449 fff8bd58 Kostas Papadimitriou
      disconnect: function(cb) {
450 fff8bd58 Kostas Papadimitriou
        var self = this;
451 27d628c4 Kostas Papadimitriou
        var complete = function() {
452 27d628c4 Kostas Papadimitriou
          self.set({status: 'DISCONNECTING'});
453 27d628c4 Kostas Papadimitriou
          cb();
454 27d628c4 Kostas Papadimitriou
        }
455 27d628c4 Kostas Papadimitriou
        this.get('port').disconnect(cb);
456 fff8bd58 Kostas Papadimitriou
      }
457 fff8bd58 Kostas Papadimitriou
    });
458 fff8bd58 Kostas Papadimitriou
459 fff8bd58 Kostas Papadimitriou
    models.FloatingIPs = models.NetworkCollection.extend({
460 fff8bd58 Kostas Papadimitriou
      model: models.FloatingIP,
461 fff8bd58 Kostas Papadimitriou
      details: false,
462 fff8bd58 Kostas Papadimitriou
      path: 'floatingips',
463 fff8bd58 Kostas Papadimitriou
      parse: function(resp) {
464 fff8bd58 Kostas Papadimitriou
        return resp.floatingips;
465 fff8bd58 Kostas Papadimitriou
      }
466 fff8bd58 Kostas Papadimitriou
    });
467 fff8bd58 Kostas Papadimitriou
468 fff8bd58 Kostas Papadimitriou
    models.Router = models.NetworkModel.extend({
469 fff8bd58 Kostas Papadimitriou
    });
470 fff8bd58 Kostas Papadimitriou
471 fff8bd58 Kostas Papadimitriou
    models.Routers = models.NetworkCollection.extend({
472 fff8bd58 Kostas Papadimitriou
      model: models.Router,
473 fff8bd58 Kostas Papadimitriou
      path: 'routers',
474 fff8bd58 Kostas Papadimitriou
      parse: function(resp) {
475 fff8bd58 Kostas Papadimitriou
        return resp.routers
476 fff8bd58 Kostas Papadimitriou
      }
477 fff8bd58 Kostas Papadimitriou
    });
478 fff8bd58 Kostas Papadimitriou
479 fff8bd58 Kostas Papadimitriou
    snf.storage.floating_ips = new models.FloatingIPs();
480 fff8bd58 Kostas Papadimitriou
    snf.storage.routers = new models.Routers();
481 fff8bd58 Kostas Papadimitriou
    snf.storage.networks = new models.Networks();
482 fff8bd58 Kostas Papadimitriou
    snf.storage.ports = new models.Ports();
483 fff8bd58 Kostas Papadimitriou
    snf.storage.subnets = new models.Subnets();
484 fff8bd58 Kostas Papadimitriou
485 fff8bd58 Kostas Papadimitriou
})(this);