You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by im...@apache.org on 2014/12/24 18:36:32 UTC

[09/12] stratos git commit: Introducing generic methods for creating kubernetes replication controllers, services and pods

http://git-wip-us.apache.org/repos/asf/stratos/blob/11f9cbd1/components/org.apache.stratos.kubernetes.client/src/test/java/org/apache/stratos/kubernetes/client/live/KubernetesApiClientLiveTest.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.kubernetes.client/src/test/java/org/apache/stratos/kubernetes/client/live/KubernetesApiClientLiveTest.java b/components/org.apache.stratos.kubernetes.client/src/test/java/org/apache/stratos/kubernetes/client/live/KubernetesApiClientLiveTest.java
index 649032d..9ee1aef 100644
--- a/components/org.apache.stratos.kubernetes.client/src/test/java/org/apache/stratos/kubernetes/client/live/KubernetesApiClientLiveTest.java
+++ b/components/org.apache.stratos.kubernetes.client/src/test/java/org/apache/stratos/kubernetes/client/live/KubernetesApiClientLiveTest.java
@@ -24,323 +24,200 @@ import junit.framework.TestCase;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.kubernetes.client.KubernetesApiClient;
+import org.apache.stratos.kubernetes.client.KubernetesConstants;
 import org.apache.stratos.kubernetes.client.exceptions.KubernetesClientException;
-import org.apache.stratos.kubernetes.client.model.*;
-import org.junit.Before;
-import org.junit.Test;
+import org.apache.stratos.kubernetes.client.model.Labels;
+import org.apache.stratos.kubernetes.client.model.Pod;
+import org.apache.stratos.kubernetes.client.model.ReplicationController;
+import org.apache.stratos.kubernetes.client.model.Service;
+import org.junit.*;
 import org.junit.experimental.categories.Category;
 
 import java.net.InetAddress;
 import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
 
+/**
+ * Notes:
+ * - Pull the docker image before running the live test
+ */
 @Category(org.apache.stratos.kubernetes.client.LiveTests.class)
 public class KubernetesApiClientLiveTest extends TestCase{
 
     private static final Log log = LogFactory.getLog(KubernetesApiClientLiveTest.class);
+
+    private static final int CONTAINER_PORT = 6379;
+    private static final int SERVICE_PORT = 4500;
+    private static final String DEFAULT_KUBERNETES_MASTER_IP = "172.17.8.100";
+    private static final String DEFAULT_DOCKER_IMAGE =  "gurpartap/redis";
+    private static final int POD_ACTIVATION_WAIT_TIME = 15000; // 15 seconds
+
     private KubernetesApiClient client;
     private String dockerImage;
     private String endpoint;
-    
-	@Before
-	public void setUp() {
-	    endpoint = System.getProperty("kubernetes.api.endpoint");
-	    if (endpoint == null) {
-	        endpoint = "http://192.168.1.100:8080/api/v1beta1/";
-	    }
-        log.info("Provided Kubernetes endpoint using system property [kubernetes.api.endpoint] : " +endpoint);
-	    client = new KubernetesApiClient(endpoint);
-	    
-	    // image should be pre-downloaded for ease of testing.
-	    dockerImage = System.getProperty("docker.image");
-	    if (dockerImage == null) {
-	        dockerImage = "gurpartap/redis";
-	    }
-	}
-	
-	@Test
-	public void testPods() throws Exception { 
-	    log.info("Testing Pods ....");
-	    String podId = "nirmal-test-pod";
-        Pod pod = new Pod();
-        pod.setApiVersion("v1beta1");
-        pod.setId(podId);
-        pod.setKind("Pod");
-        Labels l = new Labels();
-        l.setName("nirmal");
-        pod.setLabels(l);
-        State desiredState = new State();
-        Manifest m = new Manifest();
-        m.setId(podId);
-        m.setVersion("v1beta1");
-        Container c = new Container();
-        c.setName("master");
-        c.setImage(dockerImage);
-        Port p = new Port();
-        p.setContainerPort(8379);
-        p.setHostPort(8379);
-        c.setPorts(new Port[] { p });
-        m.addContainer(c);
-        desiredState.setManifest(m);
-        pod.setState(desiredState);
-        if (log.isDebugEnabled()) {
-            log.debug("Creating a Pod "+pod);
-        }
-        client.createPod(pod);
-	    assertNotNull(client.getPod(podId));
-	    
-	    // give 2s to download the image
-	    Thread.sleep(2000);
-	    
-	    // test recreation from same id
-	    client.createPod(pod);
-	    assertNotNull(client.getPod(podId));
-	    
-	    String bogusPodId = "nirmal";
-	    // create an invalid Pod
-	    Pod pod3 = new Pod();
-	    pod3.setId(bogusPodId);
-	    try {
-	        client.createPod(pod3);
-	    } catch (Exception e) {
-	        assertEquals(true, e instanceof KubernetesClientException);
-	    }
-	    
-	    try {
-	        client.getPod(bogusPodId);
-	    } catch (Exception e) {
-	        assertEquals(true, e instanceof KubernetesClientException);
-	        assertEquals("Pod ["+bogusPodId+"] doesn't exist.", e.getMessage());
-	    }
-	    
-	    if (log.isDebugEnabled()) {
-            log.debug("Get all Pods ");
-        }
-	    Pod[] currentPods = client.getAllPods();
-	    boolean match = false;
-	    for (Pod pod2 : currentPods) {
-            if (podId.equals(pod2.getId())) {
-                match = true;
-                break;
-            }
-        }
-	    assertEquals(true, match);
-	    
-	    Pod[] selectedPods = client.queryPods(new Labels[]{l});
-	    assertEquals(1, selectedPods.length);
-	    
-	    if (log.isDebugEnabled()) {
-	        log.debug("Deleting a Pod "+pod);
-	    }
-	    client.deletePod(podId);
-	    try {
-	        client.getPod(podId);
-	    } catch(Exception e) {
-	        assertEquals(true, e instanceof KubernetesClientException);
-	    }
-	    
-	    // delete a non-existing pod
-	    try {
-	        client.deletePod(bogusPodId);
-	    } catch (Exception e) {
-	        assertEquals(true, e instanceof KubernetesClientException);
-	    }
-	    
-	    selectedPods = client.queryPods(new Labels[]{l});
-        assertEquals(0, selectedPods.length);
-        
-        Labels ll = new Labels();
-        ll.setName("nirmal2");
-        selectedPods = client.queryPods(new Labels[]{l, ll});
-        assertEquals(0, selectedPods.length);
-        
-        selectedPods = client.queryPods(new Labels[]{});
-        assertEquals(0, selectedPods.length);
-	}
-	
-	@Test
-    public void testReplicationControllers() throws Exception { 
-	    String id = "nirmalController";
-	    int replicas = 2;
-	    
-        ReplicationController contr = new ReplicationController();
-        contr.setId(id);
-        contr.setKind("ReplicationController");
-        contr.setApiVersion("v1beta1");
-        State desiredState = new State();
-        desiredState.setReplicas(replicas);
-        Selector selector = new Selector();
-        selector.setName("nirmal");
-        desiredState.setReplicaSelector(selector);
-
-        Pod podTemplate = new Pod();
-        State podState = new State();
-        Manifest manifest = new Manifest();
-        manifest.setVersion("v1beta1");
-        manifest.setId(id);
-        Container container = new Container();
-        container.setName("nirmal-php");
-        container.setImage(dockerImage);
-        Port p = new Port();
-        p.setContainerPort(80);
-        container.setPorts(new Port[] { p });
-        manifest.addContainer(container);
-        podState.setManifest(manifest);
-        podTemplate.setState(podState);
-        Labels l1 = new Labels();
-        l1.setName("nirmal");
-        podTemplate.setLabels(l1);
-
-        desiredState.setPodTemplate(podTemplate);
-        contr.setDesiredState(desiredState);
-        Labels l2 = new Labels();
-        l2.setName("nirmal");
-        contr.setLabels(l2);
-        if (log.isDebugEnabled()) {
-            log.debug("Creating a Replication Controller: "+contr);
-        }
-        client.createReplicationController(contr);
-        assertNotNull(client.getReplicationController(id));
-        
-        // wait 10s for Pods to be created
-        Thread.sleep(10000);
-        
-        // test recreation using same id
-        client.createReplicationController(contr);
-        assertNotNull(client.getReplicationController(id));
-        
-        assertEquals(1, client.getAllReplicationControllers().length);
-        
-        Pod[] pods = client.queryPods(new Labels[]{l1});
-        assertEquals(replicas, pods.length);
-        
-        // test incorrect replica count
-        replicas = -1;
-        try {
-            ReplicationController replicationController = client.getReplicationController(id);
-            replicationController.getDesiredState().setReplicas(replicas);
-            client.updateReplicationController(replicationController);
-        } catch (Exception e) {
-            assertEquals(true, e instanceof KubernetesClientException);
-            assertEquals(true, e.getMessage().contains("Could not update kubernetes replication controller"));
-        }
-        
-        replicas = 0;
-        ReplicationController replicationController = client.getReplicationController(id);
-        replicationController.getDesiredState().setReplicas(replicas);
-        client.updateReplicationController(replicationController);
-
-        Thread.sleep(30000);
-        
-        pods = client.queryPods(new Labels[]{l1});
-        assertEquals(replicas, pods.length);
-        
-        client.deleteReplicationController(id);
-        try {
-            client.getReplicationController(id);
-        } catch (Exception e) {
-            assertEquals(true, e instanceof KubernetesClientException);
-        }
-        
-        String bogusContrId = "nirmal";
-        // create an invalid Controller
-        ReplicationController bogusContr = new ReplicationController();
-        bogusContr.setId(bogusContrId);
-        try {
-            client.createReplicationController(bogusContr);
-        } catch (Exception e) {
-            assertEquals(true, e instanceof KubernetesClientException);
-        }
-        
-        try {
-            client.getReplicationController(bogusContrId);
-        } catch (Exception e) {
-            assertEquals(true, e instanceof KubernetesClientException);
-            assertEquals("Replication Controller ["+bogusContrId+"] doesn't exist.", e.getMessage());
+
+    @BeforeClass
+    public void setUp() {
+        endpoint = System.getProperty("kubernetes.api.endpoint");
+        if (endpoint == null) {
+            endpoint = "http://" + DEFAULT_KUBERNETES_MASTER_IP + ":8080/api/" + KubernetesConstants.KUBERNETES_API_VERSION + "/";
         }
-        
-        try {
-            replicationController = client.getReplicationController(bogusContrId);
-            replicationController.getDesiredState().setReplicas(3);
-            client.updateReplicationController(replicationController);
-        } catch (Exception e) {
-            assertEquals(true, e instanceof KubernetesClientException);
-            assertEquals("Replication Controller ["+bogusContrId+"] doesn't exist.", e.getMessage());
+        log.info("Provided Kubernetes endpoint using system property [kubernetes.api.endpoint] : " +endpoint);
+        client = new KubernetesApiClient(endpoint);
+
+        dockerImage = System.getProperty("docker.image");
+        if (dockerImage == null) {
+            dockerImage = DEFAULT_DOCKER_IMAGE;
         }
-        
+    }
+
+    @AfterClass
+    public void cleanup() {
+        deleteReplicationControllers();
+        deletePods();
+        deleteServices();
+    }
+
+    @Test
+    public void testPodCreationAndDeletion() throws Exception {
+        log.info("Testing pod creation...");
+
+        String podId = "stratos-test-pod-1";
+        String podName = "stratos-test-pod";
+
+        List<Integer> ports = new ArrayList<Integer>();
+        ports.add(CONTAINER_PORT);
+        client.createPod(podId, podName, dockerImage, ports);
+
+        Thread.sleep(2000);
+        Pod pod = client.getPod(podId);
+        assertNotNull(pod);
+
+        Thread.sleep(POD_ACTIVATION_WAIT_TIME);
+        pod = client.getPod(podId);
+        assertNotNull(pod);
+        assertEquals(pod.getCurrentState().getStatus(), KubernetesConstants.POD_STATUS_RUNNING);
+        log.info("Pod state changed to running: " + pod.getId());
+
+        log.info("Deleting pod: " + pod.getId());
+        client.deletePod(pod.getId());
+        assertNull(client.getPod(pod.getId()));
+        log.info("Pod deleted successfully: " + pod.getId());
+    }
+
+    @Test
+    public void testDeletingAnNonExistingPod() {
         try {
-            client.deleteReplicationController(bogusContrId);
+            client.deletePod("-1234");
         } catch (Exception e) {
             assertEquals(true, e instanceof KubernetesClientException);
-            assertEquals("Replication controller does not exist: [replication-controller-id] "+bogusContrId, e.getMessage());
         }
-	}
-	
-	@Test
-    public void testServices() throws Exception { 
-	    String serviceId = "nirmal-service";
-	    Service serv = new Service();
-	    serv.setApiVersion("v1beta1");
-	    serv.setContainerPort("8379");
-	    serv.setPort(5000);
-	    serv.setId(serviceId);
-	    serv.setKind("Service");
-	    InetAddress address = InetAddress.getByName(new URL(endpoint).getHost()); 
-	    String publicIp = address.getHostAddress();
-	    serv.setPublicIPs(new String[]{publicIp});
-	    
-	    Labels l = new Labels();
-	    l.setName("nirmal");
-	    
-	    serv.setLabels(l);
-	    serv.setName("nirmal-service");
-	    Selector selector = new Selector();
-	    selector.setName(l.getName());
-	    serv.setSelector(selector);
-	    
-	    // get the services count before creation
-	    int count = client.getAllServices().length;
-	    
-	    if (log.isDebugEnabled()) {
-            log.debug("Creating a Service Proxy: "+serv);
+    }
+
+    @Test
+    public void testReplicationControllerCreationAndDeletion() throws Exception {
+        String replicationControllerId = "stratos-test-rc-1";
+        String replicationControllerName = "stratos-test-rc";
+        int replicas = 2;
+
+        List<Integer> ports = new ArrayList<Integer>();
+        ports.add(CONTAINER_PORT);
+        client.createReplicationController(replicationControllerId, replicationControllerName,
+                dockerImage, ports, null, replicas);
+
+        // Wait 5s for Pods to be created
+        Thread.sleep(5000);
+        ReplicationController replicationController = client.getReplicationController(replicationControllerId);
+
+        // Validate recreation using same id
+        log.info("Testing replication controller re-creation with an existing id: " + replicationController.getId());
+        client.createReplicationController(replicationControllerId, replicationControllerName,
+                dockerImage, ports, null, replicas);
+        log.info("Replication controller re-creation with an existing id was successful");
+
+        // Validate pod count
+        Labels label = new Labels();
+        label.setName(replicationControllerName);
+        List<Pod> pods = client.queryPods(new Labels[]{label});
+        assertEquals(replicas, pods.size());
+
+        // Delete replication controller
+        client.deleteReplicationController(replicationControllerId);
+        assertNull(client.getReplicationController(replicationControllerId));
+
+        // Delete pods
+        for(Pod pod : pods) {
+            client.deletePod(pod.getId());
+            assertNull(client.getPod(pod.getId()));
         }
-        client.createService(serv);
-        assertNotNull(client.getService(serviceId));
-        
+    }
+
+    @Test
+    public void testServiceCreationAndDeletion() throws Exception {
+        String podId = "stratos-test-pod-1";
+        String podName = "stratos-test-pod";
+        String serviceId = "stratos-test-service-1";
+        String serviceName = "stratos-test-service";
+        InetAddress address = InetAddress.getByName(new URL(endpoint).getHost());
+        String publicIp = address.getHostAddress();
+
+        List<Integer> ports = new ArrayList<Integer>();
+        ports.add(CONTAINER_PORT);
+        client.createPod(podId, podName, dockerImage, ports);
+
+        Thread.sleep(2000);
+        Pod podCreated = client.getPod(podId);
+        assertNotNull(podCreated);
+
+        client.createService(serviceId, serviceName, SERVICE_PORT, CONTAINER_PORT, publicIp);
+
+        Thread.sleep(2000);
+        Service service = client.getService(serviceId);
+
         // test recreation using same id
-        client.createService(serv);
-        assertNotNull(client.getService(serviceId));
-        
-        assertEquals(count+1, client.getAllServices().length);
-        
+        client.createService(serviceId, serviceName, SERVICE_PORT, CONTAINER_PORT, publicIp);
+
+        Thread.sleep(2000);
+        service = client.getService(serviceId);
+        assertNotNull(service);
+
         client.deleteService(serviceId);
+        assertNull(client.getService(serviceId));
+    }
+
+    public void deleteReplicationControllers() {
         try {
-            client.getService(serviceId);
-        } catch (Exception e) {
-            assertEquals(true, e instanceof KubernetesClientException);
-        }
-        
-        String bogusServId = "nirmal";
-        // create an invalid Service
-        Service bogusServ = new Service();
-        bogusServ.setId(bogusServId);
-        try {
-            client.createService(bogusServ);
-        } catch (Exception e) {
-            assertEquals(true, e instanceof KubernetesClientException);
+            List<ReplicationController> replicationControllers = client.getReplicationControllers();
+            for(ReplicationController replicationController : replicationControllers) {
+                client.deleteReplicationController(replicationController.getId());
+            }
+        } catch (KubernetesClientException e) {
+            log.error("Could not delete replication controllers", e);
         }
-        
+    }
+
+    public void deleteServices() {
         try {
-            client.getService(bogusServId);
-        } catch (Exception e) {
-            assertEquals(true, e instanceof KubernetesClientException);
-            assertEquals("Service ["+bogusServId+"] doesn't exist.", e.getMessage());
+            List<Service> services = client.getServices();
+            for(Service service : services) {
+                if(!service.getId().contains("kubernetes")) {
+                    client.deleteService(service.getId());
+                }
+            }
+        } catch (KubernetesClientException e) {
+            log.error("Could not delete services", e);
         }
-        
+    }
+
+    public void deletePods() {
         try {
-            client.deleteService(bogusServId);
-        } catch (Exception e) {
-            assertEquals(true, e instanceof KubernetesClientException);
-            assertEquals("Service ["+bogusServId+"] doesn't exist.", e.getMessage());
+            List<Pod> pods = client.getPods();
+            for(Pod replicationController : pods) {
+                client.deletePod(replicationController.getId());
+            }
+        } catch (KubernetesClientException e) {
+            log.error("Could not delete pods", e);
         }
-	}
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/11f9cbd1/components/org.apache.stratos.kubernetes.client/src/test/java/org/apache/stratos/kubernetes/client/unit/PodUnitTest.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.kubernetes.client/src/test/java/org/apache/stratos/kubernetes/client/unit/PodUnitTest.java b/components/org.apache.stratos.kubernetes.client/src/test/java/org/apache/stratos/kubernetes/client/unit/PodUnitTest.java
index 65d2108..8c374ac 100644
--- a/components/org.apache.stratos.kubernetes.client/src/test/java/org/apache/stratos/kubernetes/client/unit/PodUnitTest.java
+++ b/components/org.apache.stratos.kubernetes.client/src/test/java/org/apache/stratos/kubernetes/client/unit/PodUnitTest.java
@@ -66,10 +66,10 @@ public class PodUnitTest extends TestCase{
         Port p = new Port();
         p.setContainerPort(8379);
         p.setHostPort(8379);
-        c.setPorts(new Port[] { p });
+        c.addPort(p);
         m.addContainer(c);
         desiredState.setManifest(m);
-        pod.setState(desiredState);
+        pod.setDesiredState(desiredState);
         State currentState = desiredState;
         pod.setCurrentState(currentState);