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