Statistics
| Branch: | Revision:

root / src / com / rackspace / cloud / loadbalancer / api / client / LoadBalancerManager.java @ 71e52c4a

History | View | Annotate | Download (16.8 kB)

1
/**
2
 * 
3
 */
4
package com.rackspace.cloud.loadbalancer.api.client;
5

    
6
import java.io.IOException;
7
import java.io.StringReader;
8
import java.io.UnsupportedEncodingException;
9
import java.util.ArrayList;
10

    
11
import javax.xml.parsers.FactoryConfigurationError;
12
import javax.xml.parsers.ParserConfigurationException;
13
import javax.xml.parsers.SAXParser;
14
import javax.xml.parsers.SAXParserFactory;
15

    
16
import org.apache.http.HttpResponse;
17
import org.apache.http.client.ClientProtocolException;
18
import org.apache.http.client.methods.HttpDelete;
19
import org.apache.http.client.methods.HttpGet;
20
import org.apache.http.client.methods.HttpPost;
21
import org.apache.http.client.methods.HttpPut;
22
import org.apache.http.entity.StringEntity;
23
import org.apache.http.impl.client.BasicResponseHandler;
24
import org.apache.http.protocol.RequestExpectContinue;
25
import org.xml.sax.InputSource;
26
import org.xml.sax.SAXException;
27
import org.xml.sax.XMLReader;
28

    
29
import android.content.Context;
30
import android.util.Log;
31

    
32
import com.rackspace.cloud.files.api.client.CustomHttpClient;
33
import com.rackspace.cloud.loadbalancer.api.client.http.LoadBalancersException;
34
import com.rackspace.cloud.loadbalancer.api.parsers.CloudLoadBalancersFaultXMLParser;
35
import com.rackspace.cloud.loadbalancer.api.parsers.LoadBalancersXmlParser;
36
import com.rackspace.cloud.servers.api.client.Account;
37
import com.rackspace.cloud.servers.api.client.CloudServersException;
38
import com.rackspace.cloud.servers.api.client.http.HttpBundle;
39
import com.rackspacecloud.android.Preferences;
40

    
41
public class LoadBalancerManager extends EntityManager {
42
        private Context context;
43

    
44
        public LoadBalancerManager(Context context) {
45
                this.context = context;
46
        }
47

    
48
        public LoadBalancer getLoadBalancerById(long id)
49
                        throws LoadBalancersException {
50
                LoadBalancer loadBalancer = null;
51
                // First try DFW
52
                try {
53
                        loadBalancer = getLoadBalancerById(id,
54
                                        Account.getLoadBalancerDFWUrl());
55
                        loadBalancer.setRegion("DFW");
56
                } catch (LoadBalancersException lbe) {
57
                        // Didn't work
58

    
59
                }
60

    
61
                // Then try ORD
62
                if (loadBalancer == null) {
63
                        try {
64
                                loadBalancer = getLoadBalancerById(id,
65
                                                Account.getLoadBalancerORDUrl());
66
                                loadBalancer.setRegion("ORD");
67
                        } catch (LoadBalancersException lbe) {
68

    
69
                        }
70
                }
71

    
72
                // Then try LON
73
                if (loadBalancer == null) {
74
                        try {
75
                                loadBalancer = getLoadBalancerById(id,
76
                                                Account.getLoadBalancerLONUrl());
77
                                loadBalancer.setRegion("LON");
78
                        } catch (LoadBalancersException lbe) {
79
                                throw lbe;
80
                        }
81
                }
82
                return loadBalancer;
83
        }
84

    
85
        private LoadBalancer getLoadBalancerById(long id, String url)
86
                        throws LoadBalancersException {
87
                CustomHttpClient httpclient = new CustomHttpClient(context);
88
                HttpGet get = new HttpGet(url + Account.getAccount().getAccountId()
89
                                + "/loadbalancers/" + id);
90
                LoadBalancer loadBalancer = new LoadBalancer();
91

    
92
                get.addHeader("X-Auth-Token", Account.getAccount().getAuthToken());
93
                get.addHeader("Accept", "application/xml");
94

    
95
                try {
96
                        HttpResponse resp = httpclient.execute(get);
97
                        BasicResponseHandler responseHandler = new BasicResponseHandler();
98
                        String body = responseHandler.handleResponse(resp);
99

    
100
                        if (resp.getStatusLine().getStatusCode() == 200
101
                                        || resp.getStatusLine().getStatusCode() == 202) {
102
                                LoadBalancersXmlParser loadBalancersXMLParser = new LoadBalancersXmlParser();
103
                                SAXParser saxParser = SAXParserFactory.newInstance()
104
                                                .newSAXParser();
105
                                XMLReader xmlReader = saxParser.getXMLReader();
106
                                xmlReader.setContentHandler(loadBalancersXMLParser);
107
                                xmlReader.parse(new InputSource(new StringReader(body)));
108
                                loadBalancer = loadBalancersXMLParser.getLoadBalancer();
109
                        } else {
110
                                CloudLoadBalancersFaultXMLParser parser = new CloudLoadBalancersFaultXMLParser();
111
                                SAXParser saxParser = SAXParserFactory.newInstance()
112
                                                .newSAXParser();
113
                                XMLReader xmlReader = saxParser.getXMLReader();
114
                                xmlReader.setContentHandler(parser);
115
                                xmlReader.parse(new InputSource(new StringReader(body)));
116
                                LoadBalancersException cse = parser.getException();
117
                                throw cse;
118
                        }
119
                } catch (ClientProtocolException e) {
120
                        LoadBalancersException cse = new LoadBalancersException();
121
                        cse.setMessage(e.getLocalizedMessage());
122
                        throw cse;
123
                } catch (IOException e) {
124
                        LoadBalancersException cse = new LoadBalancersException();
125
                        cse.setMessage(e.getLocalizedMessage());
126
                        throw cse;
127
                } catch (ParserConfigurationException e) {
128
                        LoadBalancersException cse = new LoadBalancersException();
129
                        cse.setMessage(e.getLocalizedMessage());
130
                        throw cse;
131
                } catch (SAXException e) {
132
                        LoadBalancersException cse = new LoadBalancersException();
133
                        cse.setMessage(e.getLocalizedMessage());
134
                        throw cse;
135
                } catch (FactoryConfigurationError e) {
136
                        LoadBalancersException cse = new LoadBalancersException();
137
                        cse.setMessage(e.getLocalizedMessage());
138
                        throw cse;
139
                }
140
                return loadBalancer;
141
        }
142

    
143
        public ArrayList<LoadBalancer> createList() throws LoadBalancersException {
144

    
145
                ArrayList<LoadBalancer> loadBalancers = new ArrayList<LoadBalancer>();
146

    
147
                // if US account
148
                if (Account.getAccount().getAuthServer()
149
                                .equals(Preferences.COUNTRY_US_AUTH_SERVER)) {
150
                        loadBalancers
151
                                        .addAll(createSublist(Account.getLoadBalancerORDUrl()));
152
                        for (LoadBalancer loadBalancer : loadBalancers) {
153
                                loadBalancer.setRegion("ORD");
154
                        }
155
                        ArrayList<LoadBalancer> DFWloadBalancers = createSublist(Account
156
                                        .getLoadBalancerDFWUrl());
157
                        for (LoadBalancer loadBalancer : DFWloadBalancers) {
158
                                loadBalancer.setRegion("DFW");
159
                        }
160
                        loadBalancers.addAll(DFWloadBalancers);
161
                }
162
                // if UK account
163
                else if (Account.getAccount().getAuthServer()
164
                                .equals(Preferences.COUNTRY_UK_AUTH_SERVER)) {
165
                        loadBalancers
166
                                        .addAll(createSublist(Account.getLoadBalancerLONUrl()));
167
                        for (LoadBalancer loadBalancer : loadBalancers) {
168
                                loadBalancer.setRegion("LON");
169
                        }
170
                }
171
                return loadBalancers;
172
        }
173

    
174
        public ArrayList<LoadBalancer> createSublist(String regionUrl)
175
                        throws LoadBalancersException {
176
                CustomHttpClient httpclient = new CustomHttpClient(context);
177
                HttpGet get = new HttpGet(regionUrl
178
                                + Account.getAccount().getAccountId() + "/loadbalancers");
179
                ArrayList<LoadBalancer> loadBalancers = new ArrayList<LoadBalancer>();
180

    
181
                get.addHeader("X-Auth-Token", Account.getAccount().getAuthToken());
182
                get.addHeader("Accept", "application/xml");
183

    
184
                try {
185
                        HttpResponse resp = httpclient.execute(get);
186
                        BasicResponseHandler responseHandler = new BasicResponseHandler();
187
                        String body = responseHandler.handleResponse(resp);
188
                        if (resp.getStatusLine().getStatusCode() == 200
189
                                        || resp.getStatusLine().getStatusCode() == 202) {
190
                                LoadBalancersXmlParser loadBalancersXMLParser = new LoadBalancersXmlParser();
191
                                SAXParser saxParser = SAXParserFactory.newInstance()
192
                                                .newSAXParser();
193
                                XMLReader xmlReader = saxParser.getXMLReader();
194
                                xmlReader.setContentHandler(loadBalancersXMLParser);
195
                                xmlReader.parse(new InputSource(new StringReader(body)));
196
                                loadBalancers = loadBalancersXMLParser.getLoadBalancers();
197
                        } else {
198
                                CloudLoadBalancersFaultXMLParser parser = new CloudLoadBalancersFaultXMLParser();
199
                                SAXParser saxParser = SAXParserFactory.newInstance()
200
                                                .newSAXParser();
201
                                XMLReader xmlReader = saxParser.getXMLReader();
202
                                xmlReader.setContentHandler(parser);
203
                                xmlReader.parse(new InputSource(new StringReader(body)));
204
                                LoadBalancersException cse = parser.getException();
205
                                throw cse;
206
                        }
207
                } catch (ClientProtocolException e) {
208
                        LoadBalancersException cse = new LoadBalancersException();
209
                        cse.setMessage(e.getLocalizedMessage());
210
                        throw cse;
211
                } catch (IOException e) {
212
                        LoadBalancersException cse = new LoadBalancersException();
213
                        cse.setMessage(e.getLocalizedMessage());
214
                        throw cse;
215
                } catch (ParserConfigurationException e) {
216
                        LoadBalancersException cse = new LoadBalancersException();
217
                        cse.setMessage(e.getLocalizedMessage());
218
                        throw cse;
219
                } catch (SAXException e) {
220
                        LoadBalancersException cse = new LoadBalancersException();
221
                        cse.setMessage(e.getLocalizedMessage());
222
                        throw cse;
223
                } catch (FactoryConfigurationError e) {
224
                        LoadBalancersException cse = new LoadBalancersException();
225
                        cse.setMessage(e.getLocalizedMessage());
226
                        throw cse;
227
                }
228
                return loadBalancers;
229
        }
230

    
231
        public HttpBundle create(LoadBalancer entity, String regionUrl)
232
                        throws CloudServersException {
233
                HttpResponse resp = null;
234
                CustomHttpClient httpclient = new CustomHttpClient(context);
235

    
236
                HttpPost post = new HttpPost(regionUrl
237
                                + Account.getAccount().getAccountId() + "/loadbalancers");
238
                post.addHeader("Content-Type", "application/xml");
239

    
240
                StringEntity tmp = null;
241
                try {
242
                        tmp = new StringEntity(entity.toDetailedXML());
243
                } catch (UnsupportedEncodingException e) {
244
                        CloudServersException cse = new CloudServersException();
245
                        cse.setMessage(e.getLocalizedMessage());
246
                        throw cse;
247
                }
248

    
249
                post.setEntity(tmp);
250

    
251
                post.addHeader("X-Auth-Token", Account.getAccount().getAuthToken());
252
                httpclient.removeRequestInterceptorByClass(RequestExpectContinue.class);
253

    
254
                HttpBundle bundle = new HttpBundle();
255
                bundle.setCurlRequest(post);
256
                try {
257
                        resp = httpclient.execute(post);
258
                        bundle.setHttpResponse(resp);
259
                } catch (ClientProtocolException e) {
260
                        CloudServersException cse = new CloudServersException();
261
                        cse.setMessage(e.getLocalizedMessage());
262
                        throw cse;
263
                } catch (IOException e) {
264
                        CloudServersException cse = new CloudServersException();
265
                        cse.setMessage(e.getLocalizedMessage());
266
                        throw cse;
267
                } catch (FactoryConfigurationError e) {
268
                        CloudServersException cse = new CloudServersException();
269
                        cse.setMessage(e.getLocalizedMessage());
270
                        throw cse;
271
                }
272
                return bundle;
273
        }
274

    
275
        public HttpBundle delete(LoadBalancer loadBalancer)
276
                        throws CloudServersException {
277
                HttpResponse resp = null;
278
                CustomHttpClient httpclient = new CustomHttpClient(context);
279

    
280
                HttpDelete delete = new HttpDelete(
281
                                LoadBalancer.getRegionUrl(loadBalancer.getRegion())
282
                                                + Account.getAccount().getAccountId()
283
                                                + "/loadbalancers/" + loadBalancer.getId());
284
                delete.addHeader("X-Auth-Token", Account.getAccount().getAuthToken());
285
                delete.addHeader("Content-Type", "application/xml");
286
                httpclient.removeRequestInterceptorByClass(RequestExpectContinue.class);
287

    
288
                HttpBundle bundle = new HttpBundle();
289
                bundle.setCurlRequest(delete);
290

    
291
                try {
292
                        resp = httpclient.execute(delete);
293
                        bundle.setHttpResponse(resp);
294
                } catch (ClientProtocolException e) {
295
                        CloudServersException cse = new CloudServersException();
296
                        cse.setMessage(e.getLocalizedMessage());
297
                        throw cse;
298
                } catch (IOException e) {
299
                        CloudServersException cse = new CloudServersException();
300
                        cse.setMessage(e.getLocalizedMessage());
301
                        throw cse;
302
                } catch (FactoryConfigurationError e) {
303
                        CloudServersException cse = new CloudServersException();
304
                        cse.setMessage(e.getLocalizedMessage());
305
                        throw cse;
306
                }
307
                return bundle;
308
        }
309

    
310
        public HttpBundle update(LoadBalancer loadBalancer, String name,
311
                        String algorithm, String protocol, String port)
312
                        throws CloudServersException {
313
                HttpResponse resp = null;
314
                CustomHttpClient httpclient = new CustomHttpClient(context);
315

    
316
                HttpPut put = new HttpPut(LoadBalancer.getRegionUrl(loadBalancer
317
                                .getRegion())
318
                                + Account.getAccount().getAccountId()
319
                                + "/loadbalancers/" + loadBalancer.getId());
320

    
321
                put.addHeader("X-Auth-Token", Account.getAccount().getAuthToken());
322
                put.addHeader("Content-Type", "application/xml");
323

    
324
                String xml = "<loadBalancer xmlns=\"http://docs.openstack.org/loadbalancers/api/v1.0\" "
325
                                + "name=\""
326
                                + name
327
                                + "\" "
328
                                + "algorithm=\""
329
                                + algorithm.toUpperCase()
330
                                + "\" "
331
                                + "protocol=\""
332
                                + protocol + "\" " + "port=\"" + port + "\" />";
333

    
334
                StringEntity tmp = null;
335
                try {
336
                        tmp = new StringEntity(xml);
337
                } catch (UnsupportedEncodingException e) {
338
                        CloudServersException cse = new CloudServersException();
339
                        cse.setMessage(e.getLocalizedMessage());
340
                        throw cse;
341
                }
342

    
343
                put.setEntity(tmp);
344
                httpclient.removeRequestInterceptorByClass(RequestExpectContinue.class);
345

    
346
                HttpBundle bundle = new HttpBundle();
347
                bundle.setCurlRequest(put);
348

    
349
                try {
350
                        resp = httpclient.execute(put);
351
                        bundle.setHttpResponse(resp);
352
                } catch (ClientProtocolException e) {
353
                        CloudServersException cse = new CloudServersException();
354
                        cse.setMessage(e.getLocalizedMessage());
355
                        throw cse;
356
                } catch (IOException e) {
357
                        CloudServersException cse = new CloudServersException();
358
                        cse.setMessage(e.getLocalizedMessage());
359
                        throw cse;
360
                } catch (FactoryConfigurationError e) {
361
                        CloudServersException cse = new CloudServersException();
362
                        cse.setMessage(e.getLocalizedMessage());
363
                        throw cse;
364
                }
365
                return bundle;
366
        }
367

    
368
        public HttpBundle setLogging(LoadBalancer loadBalancer, Boolean setting)
369
                        throws CloudServersException {
370
                HttpResponse resp = null;
371
                CustomHttpClient httpclient = new CustomHttpClient(context);
372

    
373
                HttpPut put = new HttpPut(LoadBalancer.getRegionUrl(loadBalancer
374
                                .getRegion())
375
                                + Account.getAccount().getAccountId()
376
                                + "/loadbalancers/"
377
                                + loadBalancer.getId()
378
                                + "/connectionlogging");
379

    
380
                put.addHeader("X-Auth-Token", Account.getAccount().getAuthToken());
381
                put.addHeader("Content-Type", "application/xml");
382

    
383
                String xml = "<connectionLogging xmlns=\"http://docs.openstack.org/loadbalancers/api/v1.0\" "
384
                                + "enabled=\"" + setting.toString() + "\" />";
385

    
386
                StringEntity tmp = null;
387
                try {
388
                        tmp = new StringEntity(xml);
389
                } catch (UnsupportedEncodingException e) {
390
                        CloudServersException cse = new CloudServersException();
391
                        cse.setMessage(e.getLocalizedMessage());
392
                        throw cse;
393
                }
394

    
395
                put.setEntity(tmp);
396
                httpclient.removeRequestInterceptorByClass(RequestExpectContinue.class);
397

    
398
                HttpBundle bundle = new HttpBundle();
399
                bundle.setCurlRequest(put);
400

    
401
                try {
402
                        resp = httpclient.execute(put);
403
                        bundle.setHttpResponse(resp);
404
                } catch (ClientProtocolException e) {
405
                        CloudServersException cse = new CloudServersException();
406
                        cse.setMessage(e.getLocalizedMessage());
407
                        throw cse;
408
                } catch (IOException e) {
409
                        CloudServersException cse = new CloudServersException();
410
                        cse.setMessage(e.getLocalizedMessage());
411
                        throw cse;
412
                } catch (FactoryConfigurationError e) {
413
                        CloudServersException cse = new CloudServersException();
414
                        cse.setMessage(e.getLocalizedMessage());
415
                        throw cse;
416
                }
417
                return bundle;
418
        }
419

    
420
        public HttpBundle setSessionPersistence(LoadBalancer loadBalancer,
421
                        String setting) throws CloudServersException {
422
                HttpResponse resp = null;
423
                CustomHttpClient httpclient = new CustomHttpClient(context);
424

    
425
                HttpPut put = new HttpPut(LoadBalancer.getRegionUrl(loadBalancer
426
                                .getRegion())
427
                                + Account.getAccount().getAccountId()
428
                                + "/loadbalancers/"
429
                                + loadBalancer.getId()
430
                                + "/sessionpersistence");
431

    
432
                put.addHeader("X-Auth-Token", Account.getAccount().getAuthToken());
433
                put.addHeader("Content-Type", "application/xml");
434

    
435
                String xml = "<sessionPersistence xmlns=\"http://docs.openstack.org/loadbalancers/api/v1.0\" persistenceType=\""
436
                                + setting + "\"/>";
437

    
438
                Log.d("info", "session persist xml is: " + xml);
439

    
440
                StringEntity tmp = null;
441
                try {
442
                        tmp = new StringEntity(xml);
443
                } catch (UnsupportedEncodingException e) {
444
                        CloudServersException cse = new CloudServersException();
445
                        cse.setMessage(e.getLocalizedMessage());
446
                        throw cse;
447
                }
448

    
449
                put.setEntity(tmp);
450
                httpclient.removeRequestInterceptorByClass(RequestExpectContinue.class);
451

    
452
                HttpBundle bundle = new HttpBundle();
453
                bundle.setCurlRequest(put);
454

    
455
                try {
456
                        resp = httpclient.execute(put);
457
                        bundle.setHttpResponse(resp);
458
                } catch (ClientProtocolException e) {
459
                        CloudServersException cse = new CloudServersException();
460
                        cse.setMessage(e.getLocalizedMessage());
461
                        throw cse;
462
                } catch (IOException e) {
463
                        CloudServersException cse = new CloudServersException();
464
                        cse.setMessage(e.getLocalizedMessage());
465
                        throw cse;
466
                } catch (FactoryConfigurationError e) {
467
                        CloudServersException cse = new CloudServersException();
468
                        cse.setMessage(e.getLocalizedMessage());
469
                        throw cse;
470
                }
471
                return bundle;
472
        }
473

    
474
        public HttpBundle disableSessionPersistence(LoadBalancer loadBalancer)
475
                        throws CloudServersException {
476
                HttpResponse resp = null;
477
                CustomHttpClient httpclient = new CustomHttpClient(context);
478

    
479
                HttpDelete delete = new HttpDelete(
480
                                LoadBalancer.getRegionUrl(loadBalancer.getRegion())
481
                                                + Account.getAccount().getAccountId()
482
                                                + "/loadbalancers/" + loadBalancer.getId()
483
                                                + "/sessionpersistence");
484

    
485
                delete.addHeader("X-Auth-Token", Account.getAccount().getAuthToken());
486

    
487
                httpclient.removeRequestInterceptorByClass(RequestExpectContinue.class);
488

    
489
                HttpBundle bundle = new HttpBundle();
490
                bundle.setCurlRequest(delete);
491

    
492
                try {
493
                        resp = httpclient.execute(delete);
494
                        bundle.setHttpResponse(resp);
495
                } catch (ClientProtocolException e) {
496
                        CloudServersException cse = new CloudServersException();
497
                        cse.setMessage(e.getLocalizedMessage());
498
                        throw cse;
499
                } catch (IOException e) {
500
                        CloudServersException cse = new CloudServersException();
501
                        cse.setMessage(e.getLocalizedMessage());
502
                        throw cse;
503
                } catch (FactoryConfigurationError e) {
504
                        CloudServersException cse = new CloudServersException();
505
                        cse.setMessage(e.getLocalizedMessage());
506
                        throw cse;
507
                }
508
                return bundle;
509
        }
510

    
511
}