Implementing kubernetes client API using Apache Http Client

Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/4dbe2c65
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/4dbe2c65
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/4dbe2c65

Branch: refs/heads/docker-integration
Commit: 4dbe2c651b248a7bc648c127cba0357a044b48ba
Parents: 5e7d8b0
Author: Nirmal Fernando <[email protected]>
Authored: Fri Sep 19 14:02:03 2014 +0530
Committer: Nirmal Fernando <[email protected]>
Committed: Fri Sep 19 16:03:19 2014 +0530

----------------------------------------------------------------------
 .../kubernetes/client/KubernetesApiClient.java  | 278 ++++++++++++++-----
 1 file changed, 207 insertions(+), 71 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/4dbe2c65/components/org.apache.stratos.kubernetes.client/src/main/java/org/apache/stratos/kubernetes/client/KubernetesApiClient.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.kubernetes.client/src/main/java/org/apache/stratos/kubernetes/client/KubernetesApiClient.java
 
b/components/org.apache.stratos.kubernetes.client/src/main/java/org/apache/stratos/kubernetes/client/KubernetesApiClient.java
index 52ca93a..68e9ad0 100644
--- 
a/components/org.apache.stratos.kubernetes.client/src/main/java/org/apache/stratos/kubernetes/client/KubernetesApiClient.java
+++ 
b/components/org.apache.stratos.kubernetes.client/src/main/java/org/apache/stratos/kubernetes/client/KubernetesApiClient.java
@@ -20,40 +20,57 @@
  */
 package org.apache.stratos.kubernetes.client;
 
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.SocketException;
+
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.http.HttpResponse;
 import org.apache.http.HttpStatus;
-import 
org.apache.stratos.kubernetes.client.interfaces.KubernetesAPIClientInterface;
 import 
org.apache.stratos.kubernetes.client.exceptions.KubernetesClientException;
+import 
org.apache.stratos.kubernetes.client.interfaces.KubernetesAPIClientInterface;
 import org.apache.stratos.kubernetes.client.model.Pod;
 import org.apache.stratos.kubernetes.client.model.PodList;
 import org.apache.stratos.kubernetes.client.model.ReplicationController;
 import org.apache.stratos.kubernetes.client.model.ReplicationControllerList;
 import org.apache.stratos.kubernetes.client.model.Service;
 import org.apache.stratos.kubernetes.client.model.ServiceList;
-import org.jboss.resteasy.client.ClientRequest;
-import org.jboss.resteasy.client.ClientResponse;
+import org.apache.stratos.kubernetes.client.rest.RestClient;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
 
 public class KubernetesApiClient implements KubernetesAPIClientInterface {
        
-       private String endpointUrl;
        private static final Log log = 
LogFactory.getLog(KubernetesApiClient.class);
+       private RestClient restClient;
        
        public KubernetesApiClient(String endpointUrl) {
-               this.endpointUrl = endpointUrl;
+               restClient = new RestClient(endpointUrl);
        }
 
        @Override
        public Pod getPod(String podId) throws KubernetesClientException{
                try {
-                       ClientRequest request = new 
ClientRequest(endpointUrl+"pods/{podId}");
-                       ClientResponse<Pod> res = 
request.pathParameter("podId", podId).get(Pod.class);
-                       if (res.getEntity() == null ) {
-                               String msg = "Pod ["+podId+"] doesn't exist.";
+            HttpResponse res = restClient.doGet("pods/"+podId);
+            
+            if (res.getStatusLine().getStatusCode() == 
HttpStatus.SC_NOT_FOUND) {
+               String msg = "Pod ["+podId+"] doesn't exist.";
                                log.error(msg);
                                throw new KubernetesClientException(msg);
-                       }
-                       return res.getEntity();
+            }
+            
+            String content = getHttpResponseString(res);
+            
+            GsonBuilder gsonBuilder = new GsonBuilder();
+                       Gson gson = gsonBuilder.create();
+                       Pod pod = gson.fromJson(content, Pod.class);
+                       
+                       return pod;
+               } catch (KubernetesClientException e) {
+                       throw e;
                } catch (Exception e) {
                        String msg = "Error while retrieving Pod info with Pod 
ID: "+podId;
                        log.error(msg, e);
@@ -65,12 +82,19 @@ public class KubernetesApiClient implements 
KubernetesAPIClientInterface {
        public Pod[] getAllPods() throws KubernetesClientException {
                
                try {
-                       ClientRequest request = new 
ClientRequest(endpointUrl+"pods/");
-                       ClientResponse<PodList> res = 
request.get(PodList.class);
-                       if (res.getEntity() == null ) {
-                               return new Pod[0];
-                       }
-                       return res.getEntity().getItems();
+                       HttpResponse res = restClient.doGet("pods");
+            
+            if (res.getStatusLine().getStatusCode() == 
HttpStatus.SC_NOT_FOUND) {
+               return new Pod[0];
+            }
+            
+            String content = getHttpResponseString(res);
+            
+            GsonBuilder gsonBuilder = new GsonBuilder();
+                       Gson gson = gsonBuilder.create();
+                       PodList podList = gson.fromJson(content, PodList.class);
+                       return podList.getItems();
+                       
                } catch (Exception e) {
                        String msg = "Error while retrieving Pods.";
                        log.error(msg, e);
@@ -82,15 +106,30 @@ public class KubernetesApiClient implements 
KubernetesAPIClientInterface {
        public void createPod(Pod pod) throws KubernetesClientException {
 
                try {
-                       ClientRequest request = new 
ClientRequest(endpointUrl+"pods");
-                       ClientResponse<?> res = 
request.body("application/json", pod).post();
+                       GsonBuilder gsonBuilder = new GsonBuilder();
+                       Gson gson = gsonBuilder.create();
+                       String content = gson.toJson(pod);
+                       if (log.isDebugEnabled()) {
+                               log.debug("CreatePod Request Body : "+content);
+                       }
+                       System.out.println(content);
+                       HttpResponse res = restClient.doPost("pods", content);
+                       System.out.println(res.getStatusLine().getStatusCode());
                        
-                       if (res.getResponseStatus().getStatusCode() != 
HttpStatus.SC_ACCEPTED) {
-                               String msg = "Pod ["+pod+"] creation failed. 
Error: "+
-                                                               
res.getResponseStatus().getReasonPhrase();
+                       if (res.getStatusLine().getStatusCode() == 
HttpStatus.SC_CONFLICT) {
+                               log.warn("Pod already created. "+pod);
+                               return;
+                       }
+            
+                       if (res.getStatusLine().getStatusCode() != 
HttpStatus.SC_ACCEPTED && 
+                                       res.getStatusLine().getStatusCode() != 
HttpStatus.SC_OK) {
+                               String msg = "Pod ["+pod+"] creation failed. 
Error: "+  
+                                                               
res.getStatusLine().getReasonPhrase();
                                log.error(msg);
                                throw new KubernetesClientException(msg);
                        }
+               } catch (KubernetesClientException e) {
+                       throw e;
                } catch (Exception e) {
                        String msg = "Error while creating Pod: "+pod;
                        log.error(msg, e);
@@ -102,14 +141,22 @@ public class KubernetesApiClient implements 
KubernetesAPIClientInterface {
        public void deletePod(String podId) throws KubernetesClientException {
 
                try {
-                       ClientRequest request = new 
ClientRequest(endpointUrl+"pods/{podId}");
-                       ClientResponse<?> res = request.pathParameter("podId", 
podId).delete();
-                       if (res.getResponseStatus().getStatusCode() != 
HttpStatus.SC_ACCEPTED) {
+                       HttpResponse res = restClient.doDelete("pods/"+podId);
+            
+            if (res.getStatusLine().getStatusCode() == 
HttpStatus.SC_NOT_FOUND) {
+               String msg = "Pod ["+podId+"] doesn't exist.";
+                               log.error(msg);
+                               throw new KubernetesClientException(msg);
+            }
+            
+                       if (res.getStatusLine().getStatusCode() != 
HttpStatus.SC_ACCEPTED) {
                                String msg = "Pod ["+podId+"] deletion failed. 
Error: "+
-                                                               
res.getResponseStatus().getReasonPhrase();
+                                               
res.getStatusLine().getReasonPhrase();
                                log.error(msg);
                                throw new KubernetesClientException(msg);
                        }
+               } catch (KubernetesClientException e) {
+                       throw e;
                } catch (Exception e) {
                        String msg = "Error while retrieving Pod info of Pod 
ID: "+podId;
                        log.error(msg, e);
@@ -122,15 +169,22 @@ public class KubernetesApiClient implements 
KubernetesAPIClientInterface {
                        throws KubernetesClientException {
 
                try {
-                       ClientRequest request = new 
ClientRequest(endpointUrl+"replicationControllers/{controllerId}");
-                       ClientResponse<ReplicationController> res = 
request.pathParameter("controllerId", controllerId)
-                                       .get(ReplicationController.class);
-                       if (res.getEntity() == null ) {
-                               String msg = "Replication Controller 
["+controllerId+"] doesn't exist.";
+                       HttpResponse res = 
restClient.doGet("replicationControllers/"+controllerId);
+            
+            if (res.getStatusLine().getStatusCode() == 
HttpStatus.SC_NOT_FOUND) {
+               String msg = "Replication Controller ["+controllerId+"] doesn't 
exist.";
                                log.error(msg);
                                throw new KubernetesClientException(msg);
-                       }
-                       return res.getEntity();
+            }
+            
+            String content = getHttpResponseString(res);
+            
+            GsonBuilder gsonBuilder = new GsonBuilder();
+                       Gson gson = gsonBuilder.create();
+                       ReplicationController controller = 
gson.fromJson(content, ReplicationController.class);
+                       return controller;
+               } catch (KubernetesClientException e) {
+                       throw e;
                } catch (Exception e) {
                        String msg = "Error while retrieving Replication 
Controller info with ID: "+controllerId;
                        log.error(msg, e);
@@ -143,12 +197,19 @@ public class KubernetesApiClient implements 
KubernetesAPIClientInterface {
                        throws KubernetesClientException {
                
                try {
-                       ClientRequest request = new 
ClientRequest(endpointUrl+"replicationControllers/");
-                       ClientResponse<ReplicationControllerList> res = 
request.get(ReplicationControllerList.class);
-                       if (res.getEntity() == null ) {
-                               return new ReplicationController[0];
-                       }
-                       return res.getEntity().getItems();
+                       HttpResponse res = 
restClient.doGet("replicationControllers");
+            
+            if (res.getStatusLine().getStatusCode() == 
HttpStatus.SC_NOT_FOUND) {
+               return new ReplicationController[0];
+            }
+            
+            String content = getHttpResponseString(res);
+            
+            GsonBuilder gsonBuilder = new GsonBuilder();
+                       Gson gson = gsonBuilder.create();
+                       ReplicationControllerList podList = 
gson.fromJson(content, ReplicationControllerList.class);
+                       
+                       return podList.getItems();
                } catch (Exception e) {
                        String msg = "Error while retrieving Replication 
Controllers.";
                        log.error(msg, e);
@@ -161,18 +222,26 @@ public class KubernetesApiClient implements 
KubernetesAPIClientInterface {
                        throws KubernetesClientException {
 
                try {
-                       ClientRequest request = new ClientRequest(endpointUrl
-                                       + "replicationControllers/");
-                       ClientResponse<?> res = request
-                                       .body("application/json", 
controller).post();
-
-                       if (res.getResponseStatus().getStatusCode() != 
HttpStatus.SC_ACCEPTED) {
+                       
+                       GsonBuilder gsonBuilder = new GsonBuilder();
+                       Gson gson = gsonBuilder.create();
+                       String content = gson.toJson(controller);
+                       if (log.isDebugEnabled()) {
+                               log.debug("CreateReplicationController Request 
Body : "+content);
+                       }
+                       HttpResponse res = 
restClient.doPost("replicationControllers", content);
+            
+                       if (res.getStatusLine().getStatusCode() != 
HttpStatus.SC_ACCEPTED && 
+                                       res.getStatusLine().getStatusCode() != 
HttpStatus.SC_OK) {
                                String msg = "Replication Controller [" + 
controller
                                                + "] creation failed. Error: "
-                                               + 
res.getResponseStatus().getReasonPhrase();
+                                               + 
res.getStatusLine().getReasonPhrase();
                                log.error(msg);
                                throw new KubernetesClientException(msg);
                        }
+                       
+               } catch (KubernetesClientException e) {
+                       throw e;
                } catch (Exception e) {
                        String msg = "Error while creating Replication 
Controller: "
                                        + controller;
@@ -187,14 +256,22 @@ public class KubernetesApiClient implements 
KubernetesAPIClientInterface {
                        throws KubernetesClientException {
                
                try {
-                       ClientRequest request = new 
ClientRequest(endpointUrl+"replicationControllers/{controllerId}");
-                       ClientResponse<?> res = 
request.pathParameter("controllerId", controllerId).delete();
-                       if (res.getResponseStatus().getStatusCode() != 
HttpStatus.SC_ACCEPTED) {
+                       HttpResponse res = 
restClient.doDelete("replicationControllers/"+controllerId);
+            
+            if (res.getStatusLine().getStatusCode() == 
HttpStatus.SC_NOT_FOUND) {
+               String msg = "Replication Controller ["+controllerId+"] doesn't 
exist.";
+                               log.error(msg);
+                               throw new KubernetesClientException(msg);
+            }
+            
+                       if (res.getStatusLine().getStatusCode() != 
HttpStatus.SC_ACCEPTED) {
                                String msg = "Replication Controller 
["+controllerId+"] deletion failed. Error: "+
-                                                               
res.getResponseStatus().getReasonPhrase();
+                                               
res.getStatusLine().getReasonPhrase();
                                log.error(msg);
                                throw new KubernetesClientException(msg);
                        }
+               } catch (KubernetesClientException e) {
+                       throw e;
                } catch (Exception e) {
                        String msg = "Error while retrieving Replication 
Controller info of Controller ID: "+controllerId;
                        log.error(msg, e);
@@ -206,14 +283,21 @@ public class KubernetesApiClient implements 
KubernetesAPIClientInterface {
        public Service getService(String serviceId)
                        throws KubernetesClientException {
                try {
-                       ClientRequest request = new 
ClientRequest(endpointUrl+"services/{serviceId}");
-                       ClientResponse<Service> res = 
request.pathParameter("serviceId", serviceId).get(Service.class);
-                       if (res.getEntity() == null ) {
-                               String msg = "Service ["+serviceId+"] doesn't 
exist.";
+                       HttpResponse res = 
restClient.doGet("services/"+serviceId);
+            
+            if (res.getStatusLine().getStatusCode() == 
HttpStatus.SC_NOT_FOUND) {
+               String msg = "Service ["+serviceId+"] doesn't exist.";
                                log.error(msg);
                                throw new KubernetesClientException(msg);
-                       }
-                       return res.getEntity();
+            }
+            
+            String content = getHttpResponseString(res);
+            
+            GsonBuilder gsonBuilder = new GsonBuilder();
+                       Gson gson = gsonBuilder.create();
+                       Service service = gson.fromJson(content, Service.class);
+                       return service;
+                       
                } catch (Exception e) {
                        String msg = "Error while retrieving Service info with 
Service ID: "+serviceId;
                        log.error(msg, e);
@@ -224,12 +308,18 @@ public class KubernetesApiClient implements 
KubernetesAPIClientInterface {
        @Override
        public Service[] getAllServices() throws KubernetesClientException {
                try {
-                       ClientRequest request = new 
ClientRequest(endpointUrl+"services/");
-                       ClientResponse<ServiceList> res = 
request.get(ServiceList.class);
-                       if (res.getEntity() == null ) {
-                               return new Service[0];
-                       }
-                       return res.getEntity().getItems();
+                       HttpResponse res = restClient.doGet("services");
+            
+            if (res.getStatusLine().getStatusCode() == 
HttpStatus.SC_NOT_FOUND) {
+               return new Service[0];
+            }
+            
+            String content = getHttpResponseString(res);
+            
+            GsonBuilder gsonBuilder = new GsonBuilder();
+                       Gson gson = gsonBuilder.create();
+                       ServiceList serviceList = gson.fromJson(content, 
ServiceList.class);
+                       return serviceList.getItems();
                } catch (Exception e) {
                        String msg = "Error while retrieving Services.";
                        log.error(msg, e);
@@ -241,15 +331,26 @@ public class KubernetesApiClient implements 
KubernetesAPIClientInterface {
        public void createService(Service service) throws 
KubernetesClientException {
 
                try {
-                       ClientRequest request = new 
ClientRequest(endpointUrl+"services/");
-                       ClientResponse<?> res = 
request.body("application/json", service).post();
-                       
-                       if (res.getResponseStatus().getStatusCode() != 
HttpStatus.SC_ACCEPTED) {
+                       GsonBuilder gsonBuilder = new GsonBuilder();
+                       Gson gson = gsonBuilder.create();
+                       String content = gson.toJson(service);
+                       if (log.isDebugEnabled()) {
+                               log.debug("CreateService Request Body : 
"+content);
+                       }
+                       System.out.println(content);
+                       HttpResponse res = restClient.doPost("services", 
content);
+                       System.out.println(res.getStatusLine().getStatusCode());
+            
+                       if (res.getStatusLine().getStatusCode() != 
HttpStatus.SC_ACCEPTED && 
+                                       res.getStatusLine().getStatusCode() != 
HttpStatus.SC_OK) {
                                String msg = "Service ["+service+"] creation 
failed. Error: "+
-                                                               
res.getResponseStatus().getReasonPhrase();
+                                               
res.getStatusLine().getReasonPhrase();
                                log.error(msg);
                                throw new KubernetesClientException(msg);
                        }
+               } catch (KubernetesClientException e) {
+                       throw e;
+                       
                } catch (Exception e) {
                        String msg = "Error while creating the Service: 
"+service;
                        log.error(msg, e);
@@ -262,19 +363,54 @@ public class KubernetesApiClient implements 
KubernetesAPIClientInterface {
                        throws KubernetesClientException {
 
                try {
-                       ClientRequest request = new 
ClientRequest(endpointUrl+"services/{serviceId}");
-                       ClientResponse<?> res = 
request.pathParameter("serviceId", serviceId).delete();
-                       if (res.getResponseStatus().getStatusCode() != 
HttpStatus.SC_ACCEPTED) {
+                       HttpResponse res = 
restClient.doDelete("services/"+serviceId);
+            
+            if (res.getStatusLine().getStatusCode() == 
HttpStatus.SC_NOT_FOUND) {
+               String msg = "Service ["+serviceId+"] doesn't exist.";
+                               log.error(msg);
+                               throw new KubernetesClientException(msg);
+            }
+            
+                       if (res.getStatusLine().getStatusCode() != 
HttpStatus.SC_ACCEPTED) {
                                String msg = "Service ["+serviceId+"] deletion 
failed. Error: "+
-                                                               
res.getResponseStatus().getReasonPhrase();
+                                               
res.getStatusLine().getReasonPhrase();
                                log.error(msg);
                                throw new KubernetesClientException(msg);
                        }
+               } catch (KubernetesClientException e) {
+                       throw e;
+                       
                } catch (Exception e) {
                        String msg = "Error while retrieving Service info of 
Service ID: "+serviceId;
                        log.error(msg, e);
                        throw new KubernetesClientException(msg, e);
                }
        }
+       
+       // This method gives the HTTP response string
+       private String getHttpResponseString(HttpResponse response) {
+               try {
+                       BufferedReader reader = new BufferedReader(new 
InputStreamReader(
+                                       (response.getEntity().getContent())));
+
+                       String output;
+                       String result = "";
+
+                       while ((output = reader.readLine()) != null) {
+                               result += output;
+                       }
+
+                       return result;
+               } catch (SocketException e) {
+                       log.error("Connection problem");
+                       return null;
+               } catch (NullPointerException e) {
+                       log.error("Null value return from server");
+                       return null;
+               } catch (IOException e) {
+                       log.error("IO error");
+                       return null;
+               }
+       }
 
 }

Reply via email to