/** * */ package com.rackspace.cloud.loadbalancer.api.client; import java.io.IOException; import java.io.StringReader; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import javax.xml.parsers.FactoryConfigurationError; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.methods.HttpDelete; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpPut; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.BasicResponseHandler; import org.apache.http.protocol.RequestExpectContinue; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import android.content.Context; import android.util.Log; import com.rackspace.cloud.files.api.client.CustomHttpClient; import com.rackspace.cloud.loadbalancer.api.client.http.LoadBalancersException; import com.rackspace.cloud.loadbalancer.api.parsers.CloudLoadBalancersFaultXMLParser; import com.rackspace.cloud.loadbalancer.api.parsers.LoadBalancersXmlParser; import com.rackspace.cloud.servers.api.client.Account; import com.rackspace.cloud.servers.api.client.CloudServersException; import com.rackspace.cloud.servers.api.client.http.HttpBundle; import com.rackspacecloud.android.Preferences; public class LoadBalancerManager extends EntityManager { private Context context; public LoadBalancerManager(Context context) { this.context = context; } public LoadBalancer getLoadBalancerById(long id) throws LoadBalancersException { LoadBalancer loadBalancer = null; // First try DFW try { loadBalancer = getLoadBalancerById(id, Account.getLoadBalancerDFWUrl()); loadBalancer.setRegion("DFW"); } catch (LoadBalancersException lbe) { // Didn't work } // Then try ORD if (loadBalancer == null) { try { loadBalancer = getLoadBalancerById(id, Account.getLoadBalancerORDUrl()); loadBalancer.setRegion("ORD"); } catch (LoadBalancersException lbe) { } } // Then try LON if (loadBalancer == null) { try { loadBalancer = getLoadBalancerById(id, Account.getLoadBalancerLONUrl()); loadBalancer.setRegion("LON"); } catch (LoadBalancersException lbe) { throw lbe; } } return loadBalancer; } private LoadBalancer getLoadBalancerById(long id, String url) throws LoadBalancersException { CustomHttpClient httpclient = new CustomHttpClient(context); HttpGet get = new HttpGet(url + Account.getAccount().getAccountId() + "/loadbalancers/" + id); LoadBalancer loadBalancer = new LoadBalancer(); get.addHeader("X-Auth-Token", Account.getAccount().getAuthToken()); get.addHeader("Accept", "application/xml"); try { HttpResponse resp = httpclient.execute(get); BasicResponseHandler responseHandler = new BasicResponseHandler(); String body = responseHandler.handleResponse(resp); if (resp.getStatusLine().getStatusCode() == 200 || resp.getStatusLine().getStatusCode() == 202) { LoadBalancersXmlParser loadBalancersXMLParser = new LoadBalancersXmlParser(); SAXParser saxParser = SAXParserFactory.newInstance() .newSAXParser(); XMLReader xmlReader = saxParser.getXMLReader(); xmlReader.setContentHandler(loadBalancersXMLParser); xmlReader.parse(new InputSource(new StringReader(body))); loadBalancer = loadBalancersXMLParser.getLoadBalancer(); } else { CloudLoadBalancersFaultXMLParser parser = new CloudLoadBalancersFaultXMLParser(); SAXParser saxParser = SAXParserFactory.newInstance() .newSAXParser(); XMLReader xmlReader = saxParser.getXMLReader(); xmlReader.setContentHandler(parser); xmlReader.parse(new InputSource(new StringReader(body))); LoadBalancersException cse = parser.getException(); throw cse; } } catch (ClientProtocolException e) { LoadBalancersException cse = new LoadBalancersException(); cse.setMessage(e.getLocalizedMessage()); throw cse; } catch (IOException e) { LoadBalancersException cse = new LoadBalancersException(); cse.setMessage(e.getLocalizedMessage()); throw cse; } catch (ParserConfigurationException e) { LoadBalancersException cse = new LoadBalancersException(); cse.setMessage(e.getLocalizedMessage()); throw cse; } catch (SAXException e) { LoadBalancersException cse = new LoadBalancersException(); cse.setMessage(e.getLocalizedMessage()); throw cse; } catch (FactoryConfigurationError e) { LoadBalancersException cse = new LoadBalancersException(); cse.setMessage(e.getLocalizedMessage()); throw cse; } return loadBalancer; } public ArrayList<LoadBalancer> createList() throws LoadBalancersException { ArrayList<LoadBalancer> loadBalancers = new ArrayList<LoadBalancer>(); String authServer = Account.getAccount().getAuthServer(); if(authServer == null){ authServer = Account.getAccount().getAuthServerV2(); } // if US account if (authServer.equals(Preferences.COUNTRY_US_AUTH_SERVER) || authServer.equals(Preferences.COUNTRY_US_AUTH_SERVER_V2)) { loadBalancers .addAll(createSublist(Account.getLoadBalancerORDUrl())); for (LoadBalancer loadBalancer : loadBalancers) { loadBalancer.setRegion("ORD"); } ArrayList<LoadBalancer> DFWloadBalancers = createSublist(Account .getLoadBalancerDFWUrl()); for (LoadBalancer loadBalancer : DFWloadBalancers) { loadBalancer.setRegion("DFW"); } loadBalancers.addAll(DFWloadBalancers); } // if UK account else if (authServer.equals(Preferences.COUNTRY_UK_AUTH_SERVER) || authServer.equals(Preferences.COUNTRY_UK_AUTH_SERVER_V2)) { loadBalancers .addAll(createSublist(Account.getLoadBalancerLONUrl())); for (LoadBalancer loadBalancer : loadBalancers) { loadBalancer.setRegion("LON"); } } return loadBalancers; } public ArrayList<LoadBalancer> createSublist(String regionUrl) throws LoadBalancersException { CustomHttpClient httpclient = new CustomHttpClient(context); HttpGet get = new HttpGet(regionUrl + Account.getAccount().getAccountId() + "/loadbalancers"); ArrayList<LoadBalancer> loadBalancers = new ArrayList<LoadBalancer>(); get.addHeader("X-Auth-Token", Account.getAccount().getAuthToken()); get.addHeader("Accept", "application/xml"); try { HttpResponse resp = httpclient.execute(get); BasicResponseHandler responseHandler = new BasicResponseHandler(); String body = responseHandler.handleResponse(resp); if (resp.getStatusLine().getStatusCode() == 200 || resp.getStatusLine().getStatusCode() == 202) { LoadBalancersXmlParser loadBalancersXMLParser = new LoadBalancersXmlParser(); SAXParser saxParser = SAXParserFactory.newInstance() .newSAXParser(); XMLReader xmlReader = saxParser.getXMLReader(); xmlReader.setContentHandler(loadBalancersXMLParser); xmlReader.parse(new InputSource(new StringReader(body))); loadBalancers = loadBalancersXMLParser.getLoadBalancers(); } else { CloudLoadBalancersFaultXMLParser parser = new CloudLoadBalancersFaultXMLParser(); SAXParser saxParser = SAXParserFactory.newInstance() .newSAXParser(); XMLReader xmlReader = saxParser.getXMLReader(); xmlReader.setContentHandler(parser); xmlReader.parse(new InputSource(new StringReader(body))); LoadBalancersException cse = parser.getException(); throw cse; } } catch (ClientProtocolException e) { LoadBalancersException cse = new LoadBalancersException(); cse.setMessage(e.getLocalizedMessage()); throw cse; } catch (IOException e) { LoadBalancersException cse = new LoadBalancersException(); cse.setMessage(e.getLocalizedMessage()); throw cse; } catch (ParserConfigurationException e) { LoadBalancersException cse = new LoadBalancersException(); cse.setMessage(e.getLocalizedMessage()); throw cse; } catch (SAXException e) { LoadBalancersException cse = new LoadBalancersException(); cse.setMessage(e.getLocalizedMessage()); throw cse; } catch (FactoryConfigurationError e) { LoadBalancersException cse = new LoadBalancersException(); cse.setMessage(e.getLocalizedMessage()); throw cse; } return loadBalancers; } public HttpBundle create(LoadBalancer entity, String regionUrl) throws CloudServersException { HttpResponse resp = null; CustomHttpClient httpclient = new CustomHttpClient(context); HttpPost post = new HttpPost(regionUrl + Account.getAccount().getAccountId() + "/loadbalancers"); post.addHeader("Content-Type", "application/xml"); StringEntity tmp = null; try { tmp = new StringEntity(entity.toDetailedXML()); } catch (UnsupportedEncodingException e) { CloudServersException cse = new CloudServersException(); cse.setMessage(e.getLocalizedMessage()); throw cse; } post.setEntity(tmp); post.addHeader("X-Auth-Token", Account.getAccount().getAuthToken()); httpclient.removeRequestInterceptorByClass(RequestExpectContinue.class); HttpBundle bundle = new HttpBundle(); bundle.setCurlRequest(post); try { resp = httpclient.execute(post); bundle.setHttpResponse(resp); } catch (ClientProtocolException e) { CloudServersException cse = new CloudServersException(); cse.setMessage(e.getLocalizedMessage()); throw cse; } catch (IOException e) { CloudServersException cse = new CloudServersException(); cse.setMessage(e.getLocalizedMessage()); throw cse; } catch (FactoryConfigurationError e) { CloudServersException cse = new CloudServersException(); cse.setMessage(e.getLocalizedMessage()); throw cse; } return bundle; } public HttpBundle delete(LoadBalancer loadBalancer) throws CloudServersException { HttpResponse resp = null; CustomHttpClient httpclient = new CustomHttpClient(context); HttpDelete delete = new HttpDelete( LoadBalancer.getRegionUrl(loadBalancer.getRegion()) + Account.getAccount().getAccountId() + "/loadbalancers/" + loadBalancer.getId()); delete.addHeader("X-Auth-Token", Account.getAccount().getAuthToken()); delete.addHeader("Content-Type", "application/xml"); httpclient.removeRequestInterceptorByClass(RequestExpectContinue.class); HttpBundle bundle = new HttpBundle(); bundle.setCurlRequest(delete); try { resp = httpclient.execute(delete); bundle.setHttpResponse(resp); } catch (ClientProtocolException e) { CloudServersException cse = new CloudServersException(); cse.setMessage(e.getLocalizedMessage()); throw cse; } catch (IOException e) { CloudServersException cse = new CloudServersException(); cse.setMessage(e.getLocalizedMessage()); throw cse; } catch (FactoryConfigurationError e) { CloudServersException cse = new CloudServersException(); cse.setMessage(e.getLocalizedMessage()); throw cse; } return bundle; } public HttpBundle update(LoadBalancer loadBalancer, String name, String algorithm, String protocol, String port) throws CloudServersException { HttpResponse resp = null; CustomHttpClient httpclient = new CustomHttpClient(context); HttpPut put = new HttpPut(LoadBalancer.getRegionUrl(loadBalancer .getRegion()) + Account.getAccount().getAccountId() + "/loadbalancers/" + loadBalancer.getId()); put.addHeader("X-Auth-Token", Account.getAccount().getAuthToken()); put.addHeader("Content-Type", "application/xml"); String xml = "<loadBalancer xmlns=\"http://docs.openstack.org/loadbalancers/api/v1.0\" " + "name=\"" + name + "\" " + "algorithm=\"" + algorithm.toUpperCase() + "\" " + "protocol=\"" + protocol + "\" " + "port=\"" + port + "\" />"; StringEntity tmp = null; try { tmp = new StringEntity(xml); } catch (UnsupportedEncodingException e) { CloudServersException cse = new CloudServersException(); cse.setMessage(e.getLocalizedMessage()); throw cse; } put.setEntity(tmp); httpclient.removeRequestInterceptorByClass(RequestExpectContinue.class); HttpBundle bundle = new HttpBundle(); bundle.setCurlRequest(put); try { resp = httpclient.execute(put); bundle.setHttpResponse(resp); } catch (ClientProtocolException e) { CloudServersException cse = new CloudServersException(); cse.setMessage(e.getLocalizedMessage()); throw cse; } catch (IOException e) { CloudServersException cse = new CloudServersException(); cse.setMessage(e.getLocalizedMessage()); throw cse; } catch (FactoryConfigurationError e) { CloudServersException cse = new CloudServersException(); cse.setMessage(e.getLocalizedMessage()); throw cse; } return bundle; } public HttpBundle setLogging(LoadBalancer loadBalancer, Boolean setting) throws CloudServersException { HttpResponse resp = null; CustomHttpClient httpclient = new CustomHttpClient(context); HttpPut put = new HttpPut(LoadBalancer.getRegionUrl(loadBalancer .getRegion()) + Account.getAccount().getAccountId() + "/loadbalancers/" + loadBalancer.getId() + "/connectionlogging"); put.addHeader("X-Auth-Token", Account.getAccount().getAuthToken()); put.addHeader("Content-Type", "application/xml"); String xml = "<connectionLogging xmlns=\"http://docs.openstack.org/loadbalancers/api/v1.0\" " + "enabled=\"" + setting.toString() + "\" />"; StringEntity tmp = null; try { tmp = new StringEntity(xml); } catch (UnsupportedEncodingException e) { CloudServersException cse = new CloudServersException(); cse.setMessage(e.getLocalizedMessage()); throw cse; } put.setEntity(tmp); httpclient.removeRequestInterceptorByClass(RequestExpectContinue.class); HttpBundle bundle = new HttpBundle(); bundle.setCurlRequest(put); try { resp = httpclient.execute(put); bundle.setHttpResponse(resp); } catch (ClientProtocolException e) { CloudServersException cse = new CloudServersException(); cse.setMessage(e.getLocalizedMessage()); throw cse; } catch (IOException e) { CloudServersException cse = new CloudServersException(); cse.setMessage(e.getLocalizedMessage()); throw cse; } catch (FactoryConfigurationError e) { CloudServersException cse = new CloudServersException(); cse.setMessage(e.getLocalizedMessage()); throw cse; } return bundle; } public HttpBundle setSessionPersistence(LoadBalancer loadBalancer, String setting) throws CloudServersException { HttpResponse resp = null; CustomHttpClient httpclient = new CustomHttpClient(context); HttpPut put = new HttpPut(LoadBalancer.getRegionUrl(loadBalancer .getRegion()) + Account.getAccount().getAccountId() + "/loadbalancers/" + loadBalancer.getId() + "/sessionpersistence"); put.addHeader("X-Auth-Token", Account.getAccount().getAuthToken()); put.addHeader("Content-Type", "application/xml"); String xml = "<sessionPersistence xmlns=\"http://docs.openstack.org/loadbalancers/api/v1.0\" persistenceType=\"" + setting + "\"/>"; Log.d("info", "session persist xml is: " + xml); StringEntity tmp = null; try { tmp = new StringEntity(xml); } catch (UnsupportedEncodingException e) { CloudServersException cse = new CloudServersException(); cse.setMessage(e.getLocalizedMessage()); throw cse; } put.setEntity(tmp); httpclient.removeRequestInterceptorByClass(RequestExpectContinue.class); HttpBundle bundle = new HttpBundle(); bundle.setCurlRequest(put); try { resp = httpclient.execute(put); bundle.setHttpResponse(resp); } catch (ClientProtocolException e) { CloudServersException cse = new CloudServersException(); cse.setMessage(e.getLocalizedMessage()); throw cse; } catch (IOException e) { CloudServersException cse = new CloudServersException(); cse.setMessage(e.getLocalizedMessage()); throw cse; } catch (FactoryConfigurationError e) { CloudServersException cse = new CloudServersException(); cse.setMessage(e.getLocalizedMessage()); throw cse; } return bundle; } public HttpBundle disableSessionPersistence(LoadBalancer loadBalancer) throws CloudServersException { HttpResponse resp = null; CustomHttpClient httpclient = new CustomHttpClient(context); HttpDelete delete = new HttpDelete( LoadBalancer.getRegionUrl(loadBalancer.getRegion()) + Account.getAccount().getAccountId() + "/loadbalancers/" + loadBalancer.getId() + "/sessionpersistence"); delete.addHeader("X-Auth-Token", Account.getAccount().getAuthToken()); httpclient.removeRequestInterceptorByClass(RequestExpectContinue.class); HttpBundle bundle = new HttpBundle(); bundle.setCurlRequest(delete); try { resp = httpclient.execute(delete); bundle.setHttpResponse(resp); } catch (ClientProtocolException e) { CloudServersException cse = new CloudServersException(); cse.setMessage(e.getLocalizedMessage()); throw cse; } catch (IOException e) { CloudServersException cse = new CloudServersException(); cse.setMessage(e.getLocalizedMessage()); throw cse; } catch (FactoryConfigurationError e) { CloudServersException cse = new CloudServersException(); cse.setMessage(e.getLocalizedMessage()); throw cse; } return bundle; } }