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); |