Repository: stratos
Updated Branches:
refs/heads/master-deployment-policy-fix-merge 520183326 -> 8a2de4562
Updating kubernetes service creation logic to set public IPs and remove host
port
Conflicts:
components/org.apache.stratos.kubernetes.client/src/main/java/org/apache/stratos/kubernetes/client/KubernetesApiClient.java
service-stubs/org.apache.stratos.autoscaler.service.stub/src/main/resources/AutoscalerService.wsdl
service-stubs/org.apache.stratos.cloud.controller.service.stub/src/main/resources/CloudControllerService.wsdl
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/8a2de456
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/8a2de456
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/8a2de456
Branch: refs/heads/master-deployment-policy-fix-merge
Commit: 8a2de4562ff65425ebae5b71026b14e5be249e4e
Parents: 5201833
Author: Imesh Gunaratne <[email protected]>
Authored: Fri Feb 27 15:33:30 2015 +0530
Committer: Imesh Gunaratne <[email protected]>
Committed: Fri Feb 27 15:39:06 2015 +0530
----------------------------------------------------------------------
.../context/CloudControllerContext.java | 8 +-
.../cloud/controller/domain/MemberContext.java | 3 +-
.../iaases/kubernetes/KubernetesIaas.java | 41 ++-
.../README.md | 64 ++++-
.../kubernetes/client/KubernetesApiClient.java | 49 ++--
.../KubernetesAPIClientInterface.java | 23 +-
.../live/KubernetesApiClientLiveTest.java | 269 ++++++++++---------
7 files changed, 270 insertions(+), 187 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/stratos/blob/8a2de456/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/context/CloudControllerContext.java
----------------------------------------------------------------------
diff --git
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/context/CloudControllerContext.java
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/context/CloudControllerContext.java
index b63bce6..8543810 100644
---
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/context/CloudControllerContext.java
+++
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/context/CloudControllerContext.java
@@ -507,8 +507,12 @@ public class CloudControllerContext implements
Serializable {
public void addKubernetesClusterContext(KubernetesClusterContext
kubernetesClusterContext) {
kubClusterIdToKubClusterContextMap.put(
- kubernetesClusterContext.getKubernetesClusterId(),
- kubernetesClusterContext);
+ kubernetesClusterContext.getKubernetesClusterId(),
kubernetesClusterContext);
+ }
+
+ public void updateKubernetesClusterContext(KubernetesClusterContext
kubernetesClusterContext) {
+ kubClusterIdToKubClusterContextMap.put(
+ kubernetesClusterContext.getKubernetesClusterId(),
kubernetesClusterContext);
}
/**
http://git-wip-us.apache.org/repos/asf/stratos/blob/8a2de456/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/MemberContext.java
----------------------------------------------------------------------
diff --git
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/MemberContext.java
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/MemberContext.java
index b7a3843..d1fe070 100644
---
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/MemberContext.java
+++
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/MemberContext.java
@@ -24,7 +24,6 @@ import org.apache.stratos.common.domain.NameValuePair;
import java.io.Serializable;
import java.util.Arrays;
-import java.util.List;
/**
* Holds information about a Member.
@@ -271,7 +270,7 @@ public class MemberContext implements Serializable {
return kubernetesPodId;
}
- public void setKubernetesPodName(String kubernetesPodName) {
+ public void setKubernetesPodLabel(String kubernetesPodName) {
this.kubernetesPodName = kubernetesPodName;
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/8a2de456/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/kubernetes/KubernetesIaas.java
----------------------------------------------------------------------
diff --git
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/kubernetes/KubernetesIaas.java
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/kubernetes/KubernetesIaas.java
index 7ea0f4a..47e620c 100644
---
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/kubernetes/KubernetesIaas.java
+++
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/kubernetes/KubernetesIaas.java
@@ -207,12 +207,12 @@ public class KubernetesIaas extends Iaas {
// Generate kubernetes service ports and update port mappings in
cartridge
updateKubernetesServicePorts(kubClusterContext,
clusterContext.getClusterId(), cartridge);
- // Create pod
+ // Create kubernetes services for port mappings
KubernetesApiClient kubernetesApi = kubClusterContext.getKubApi();
- createPod(clusterContext, memberContext, kubernetesApi);
+ createKubernetesServices(kubernetesApi, clusterContext,
kubernetesCluster);
- // Create kubernetes services for port mappings
- createKubernetesServices(kubernetesApi, clusterContext,
kubClusterContext);
+ // Create pod
+ createPod(clusterContext, memberContext, kubernetesApi);
// Wait for pod status to be changed to running
Pod pod = waitForPodToBeActivated(memberContext, kubernetesApi);
@@ -344,6 +344,7 @@ public class KubernetesIaas extends Iaas {
String applicationId = memberContext.getApplicationId();
String cartridgeType = memberContext.getCartridgeType();
+ String clusterId = memberContext.getClusterId();
String memberId = memberContext.getMemberId();
if (log.isInfoEnabled()) {
@@ -379,17 +380,17 @@ public class KubernetesIaas extends Iaas {
// Create pod
String podId = KubernetesIaasUtil.fixSpecialCharacters(memberId);
- String podName = podId;
+ String podLabel = KubernetesIaasUtil.fixSpecialCharacters(clusterId);
String dockerImage = iaasProvider.getImage();
EnvironmentVariable[] environmentVariables =
KubernetesIaasUtil.prepareEnvironmentVariables(
clusterContext, memberContext);
- kubernetesApi.createPod(podId, podName, dockerImage,
+ kubernetesApi.createPod(podId, podLabel, dockerImage,
KubernetesIaasUtil.convertPortMappings(cartridge.getPortMappings()),
environmentVariables);
// Add pod id to member context and persist
memberContext.setKubernetesPodId(podId);
- memberContext.setKubernetesPodName(podName);
+ memberContext.setKubernetesPodLabel(podLabel);
CloudControllerContext.getInstance().persist();
if (log.isInfoEnabled()) {
@@ -404,11 +405,11 @@ public class KubernetesIaas extends Iaas {
*
* @param kubernetesApi
* @param clusterContext
- * @param kubernetesClusterContext
+ * @param kubernetesCluster
* @throws KubernetesClientException
*/
private void createKubernetesServices(KubernetesApiClient kubernetesApi,
ClusterContext clusterContext,
-
KubernetesClusterContext kubernetesClusterContext) throws
KubernetesClientException {
+ KubernetesCluster
kubernetesCluster) throws KubernetesClientException {
String clusterId = clusterContext.getClusterId();
String cartridgeType = clusterContext.getCartridgeType();
@@ -426,6 +427,22 @@ public class KubernetesIaas extends Iaas {
kubernetesServices = new ArrayList<KubernetesService>();
}
+ // Prepare minion public IP addresses
+ List<String> minionPublicIPs = new ArrayList<String>();
+ KubernetesHost[] kubernetesHosts =
kubernetesCluster.getKubernetesHosts();
+ if((kubernetesHosts == null) || (kubernetesHosts.length == 0) ||
(kubernetesHosts[0] == null)) {
+ throw new RuntimeException("Hosts not found in kubernetes cluster:
[cluster] "
+ + kubernetesCluster.getClusterId());
+ }
+ for(KubernetesHost host : kubernetesHosts) {
+ if(host != null) {
+ minionPublicIPs.add(host.getPublicIPAddress());
+ }
+ }
+ if(log.isDebugEnabled()) {
+ log.debug(String.format("Minion public IPs: %s", minionPublicIPs));
+ }
+
int i = kubernetesServices.size();
for (PortMapping portMapping : cartridge.getPortMappings()) {
@@ -437,7 +454,7 @@ public class KubernetesIaas extends Iaas {
// Service id = cluster id + kubernetes service seq number of
cluster
String serviceId =
KubernetesIaasUtil.fixSpecialCharacters(clusterId + "-" + (++i));
- String serviceName = serviceId;
+ String serviceLabel =
KubernetesIaasUtil.fixSpecialCharacters(clusterId);
if (log.isInfoEnabled()) {
log.info(String.format("Creating kubernetes service: [cluster]
%s [service] %s " +
@@ -449,7 +466,8 @@ public class KubernetesIaas extends Iaas {
// Create kubernetes service for port mapping
int servicePort = portMapping.getKubernetesServicePort();
String containerPortName =
KubernetesIaasUtil.preparePortNameFromPortMapping(portMapping);
- kubernetesApi.createService(serviceId, serviceName, servicePort,
containerPortName);
+ kubernetesApi.createService(serviceId, serviceLabel, servicePort,
containerPortName,
+ minionPublicIPs.toArray(new
String[minionPublicIPs.size()]));
try {
Thread.sleep(1000);
@@ -510,6 +528,7 @@ public class KubernetesIaas extends Iaas {
}
if(servicePortsUpdated) {
// Persist service ports added to port mappings
+
CloudControllerContext.getInstance().updateKubernetesClusterContext(kubernetesClusterContext);
CloudControllerContext.getInstance().persist();
}
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/8a2de456/components/org.apache.stratos.kubernetes.client/README.md
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.kubernetes.client/README.md
b/components/org.apache.stratos.kubernetes.client/README.md
index 61d69a5..dc345e8 100644
--- a/components/org.apache.stratos.kubernetes.client/README.md
+++ b/components/org.apache.stratos.kubernetes.client/README.md
@@ -1,24 +1,64 @@
-Running Live Tests
-==================
+Kubernetes API Client Live Tests
+================================
+
+Kubernetes API client supports running live tests against a Kubernetes
cluster. Following parameters are needed to run the tests.
+
+Parameters
+----------
+###kubernetes.api.endpoint
+The Kubernetes API endpoint URL, default value:
http://172.17.8.101:8080/api/v1beta1
+
+###minion.public.ips
+The list of public IP addresses of minions in the Kubernetes cluster, default
value: 172.17.8.101
+
+###docker.image
+The name of the docker image to be used by the test, default value:
fnichol/uhttpd
+
+###container.port
+A port exposed by the docker image to test Kubernetes services, default value:
6379
+
+###test.pod.activation
+A boolean property to enable or disable pod activation test, default value:
true
+
+###test.service.socket
+A boolean property to enable or disable service socket test, default value:
true
-Google Kubernetes Java Client component supports running live tests against a
Kubernetes API server.
Pre-requisites
==============
-* Set up a Kubernetes Master node and make sure the API server is
running.Please refer to Stratos documentation as to how you could build a
setup. Say your Kubernetes API endpoint is
```http://192.168.1.100:8080/api/v1beta1/```
-* Please pull a preferred docker image into the Master node. Say your
preferred docker image is ```gurpartap/redis```.
+* Setup a Kubernetes cluster with at least one minion.
+* Login to the minion host and pull the preferred docker image.
How to run the tests
====================
-* Navigate into the folder where you have cloned Stratos.
-* Navigate to the Kubernetes Client component;
+* Clone Stratos source code:
+
+ ```
+ git clone https://git-wip-us.apache.org/repos/asf/stratos.git
+ ```
+
+* Navigate to the Kubernetes API client component:
+
+ ```
+ cd <stratos-source-home>/components/org.apache.stratos.kubernetes.client
+ ```
+
+* Run the live tests with proper parameter values:
- ```cd components/org.apache.stratos.kubernetes.client```
-* Run the live test profile;
+ ### Run with default values:
+ ```
+ mvn clean test -Plive
+ ```
- ```mvn clean install -Plive
-Dkubernetes.api.endpoint=http://192.168.1.100:8080/api/v1beta1/
-Ddocker.image=gurpartap/redis -dcontainer.port=8080```
+ ### Run with custom values:
+ ```
+ mvn clean test -Plive
-Dkubernetes.api.endpoint="http://192.168.1.101:8080/api/v1beta1/" \
+ -Dminion.public.ips="192.168.1.102"
+ -Ddocker.image="gurpartap/redis" \
+ -Dcontainer.port=6379 \
+ -Dtest.pod.activation="true" \
+ -Dtest.service.socket="true"
+ ```
-
-NOTE: Please note that these are the default values and if your setup is
equivalent to this, you can simply run ```mvn clean install -Plive```
http://git-wip-us.apache.org/repos/asf/stratos/blob/8a2de456/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 aa50d0e..f8f7c63 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
@@ -51,19 +51,19 @@ public class KubernetesApiClient implements
KubernetesAPIClientInterface {
/**
* Create new pod
* @param podId Identifier of the pod
- * @param podName Pod name to be used by the pod label
+ * @param podLabel Pod name to be used by the pod label
* @param dockerImage Docker image to be used by the pod
* @param ports Ports exposed by the pod
* @param environmentVariables Environment variables to be passed to the
pod
* @throws KubernetesClientException
*/
@Override
- public void createPod(String podId, String podName, String dockerImage,
List<Port> ports,
+ public void createPod(String podId, String podLabel, String dockerImage,
List<Port> ports,
EnvironmentVariable[] environmentVariables)
throws KubernetesClientException {
if (log.isDebugEnabled()) {
log.debug(String.format("Creating kubernetes pod: [pod-id] %s
[pod-name] %s [docker-image] %s [ports] %s",
- podId, podName, dockerImage, ports));
+ podId, podLabel, dockerImage, ports));
}
// Create pod definition
@@ -74,7 +74,7 @@ public class KubernetesApiClient implements
KubernetesAPIClientInterface {
// Set pod labels
Labels podLabels = new Labels();
- podLabels.setName(podName);
+ podLabels.setName(podLabel);
pod.setLabels(podLabels);
State desiredState = new State();
@@ -84,7 +84,7 @@ public class KubernetesApiClient implements
KubernetesAPIClientInterface {
// Set container template
Container containerTemplate = new Container();
- containerTemplate.setName(podName);
+ containerTemplate.setName(podLabel);
containerTemplate.setImage(dockerImage);
containerTemplate.setPorts(ports);
containerTemplate.setImagePullPolicy(KubernetesConstants.POLICY_PULL_IF_NOT_PRESENT);
@@ -182,8 +182,7 @@ public class KubernetesApiClient implements
KubernetesAPIClientInterface {
return;
}
- if (response.getStatusCode() != HttpStatus.SC_ACCEPTED &&
- response.getStatusCode() != HttpStatus.SC_OK) {
+ if ((response.getStatusCode() < 200) || (response.getStatusCode()
>= 300)) {
String msg = String.format("Could not create kubernetes pod:
[pod-id] %s [message] %s", pod.getId(),
extractMessageInResponse(response));
log.error(msg);
@@ -216,8 +215,7 @@ public class KubernetesApiClient implements
KubernetesAPIClientInterface {
return;
}
- if (response.getStatusCode() != HttpStatus.SC_ACCEPTED &&
- response.getStatusCode() != HttpStatus.SC_OK) {
+ if ((response.getStatusCode() < 200) || (response.getStatusCode()
>= 300)) {
String message = String.format("Could not delete kubernetes
pod: [pod-id] %s [message] %s",
podId, extractMessageInResponse(response));
log.error(message);
@@ -397,8 +395,7 @@ public class KubernetesApiClient implements
KubernetesAPIClientInterface {
return;
}
- if (response.getStatusCode() != HttpStatus.SC_ACCEPTED &&
- response.getStatusCode() != HttpStatus.SC_OK) {
+ if ((response.getStatusCode() < 200) || (response.getStatusCode()
>= 300)) {
String message = "Could not create kubernetes replication
controller: [replication-controller-id] " +
replicationController.getId() + " [message] " +
extractMessageInResponse(response);
log.error(message);
@@ -434,8 +431,7 @@ public class KubernetesApiClient implements
KubernetesAPIClientInterface {
handleNullResponse("Could not update kubernetes replication
controller: [replication-controller-id] " +
replicationController.getId(), response);
- if (response.getStatusCode() != HttpStatus.SC_ACCEPTED
- && response.getStatusCode() != HttpStatus.SC_OK) {
+ if ((response.getStatusCode() < 200) || (response.getStatusCode()
>= 300)) {
String message = "Could not update kubernetes replication
controller: [replication-controller-id] " +
replicationController.getId() + ": " +
response.getReason();
log.error(message);
@@ -478,8 +474,7 @@ public class KubernetesApiClient implements
KubernetesAPIClientInterface {
return;
}
- if (response.getStatusCode() != HttpStatus.SC_ACCEPTED &&
- response.getStatusCode() != HttpStatus.SC_OK) {
+ if ((response.getStatusCode() < 200) || (response.getStatusCode()
>= 300)) {
String message = "Could not delete kubernetes replication
controller: [replication-controller-id] " +
replicationControllerId + ": " + response.getReason();
log.error(message);
@@ -506,18 +501,19 @@ public class KubernetesApiClient implements
KubernetesAPIClientInterface {
/**
* Create kubernetes service
* @param serviceId Service id
- * @param serviceName Service name to be used by the label name
+ * @param serviceLabel Service name to be used by the label name
* @param servicePort Port to be exposed by the service
* @param containerPortName Container port name defined in the port label
+ * @param publicIPs
* @throws KubernetesClientException
*/
@Override
- public void createService(String serviceId, String serviceName, int
servicePort,
- String containerPortName) throws
KubernetesClientException {
+ public void createService(String serviceId, String serviceLabel, int
servicePort,
+ String containerPortName, String[] publicIPs)
throws KubernetesClientException {
try {
if (log.isDebugEnabled()) {
log.debug(String.format("Creating kubernetes service:
[service-id] %s [service-name] %s [service-port] %d " +
- "[container-port-name] %s", serviceId,
serviceName, servicePort,
+ "[container-port-name] %s", serviceId,
serviceLabel, servicePort,
containerPortName));
}
@@ -527,13 +523,14 @@ public class KubernetesApiClient implements
KubernetesAPIClientInterface {
service.setKind(KubernetesConstants.KIND_SERVICE);
service.setId(serviceId);
service.setPort(servicePort);
+ service.setPublicIPs(publicIPs);
service.setContainerPort(containerPortName);
// Set service labels
Labels serviceLabels = new Labels();
- serviceLabels.setName(serviceName);
+ serviceLabels.setName(serviceLabel);
service.setLabels(serviceLabels);
- service.setName(serviceName);
+ service.setName(serviceLabel);
// Set service selector
Selector selector = new Selector();
@@ -545,11 +542,11 @@ public class KubernetesApiClient implements
KubernetesAPIClientInterface {
if (log.isDebugEnabled()) {
log.debug(String.format("Kubernetes service created
successfully: [service-id] %s [service-name] %s [service-port] %d " +
- "[container-port-name] %s", serviceId, serviceName,
servicePort, containerPortName));
+ "[container-port-name] %s", serviceId, serviceLabel,
servicePort, containerPortName));
}
} catch (Exception e) {
String message = String.format("Could not create kubernetes
service: [service-id] %s [service-name] %s [service-port] %d " +
- "[container-port-name] %s", serviceId, serviceName,
servicePort, containerPortName);
+ "[container-port-name] %s", serviceId, serviceLabel,
servicePort, containerPortName);
log.error(message, e);
throw new KubernetesClientException(message, e);
}
@@ -637,8 +634,7 @@ public class KubernetesApiClient implements
KubernetesAPIClientInterface {
return;
}
- if (response.getStatusCode() != HttpStatus.SC_ACCEPTED &&
- response.getStatusCode() != HttpStatus.SC_OK) {
+ if ((response.getStatusCode() < 200) || (response.getStatusCode()
>= 300)) {
String msg = String.format("Could not create kubernetes
service: [service-id] %s [message] %s", service.getId(),
extractMessageInResponse(response));
log.error(msg);
@@ -674,8 +670,7 @@ public class KubernetesApiClient implements
KubernetesAPIClientInterface {
return;
}
- if (response.getStatusCode() != HttpStatus.SC_ACCEPTED &&
- response.getStatusCode() != HttpStatus.SC_OK) {
+ if ((response.getStatusCode() < 200) || (response.getStatusCode()
>= 300)) {
String msg = String.format("Could not delete kubernetes
service: [service-id] %s [message] %s", serviceId,
extractMessageInResponse(response));
log.error(msg);
http://git-wip-us.apache.org/repos/asf/stratos/blob/8a2de456/components/org.apache.stratos.kubernetes.client/src/main/java/org/apache/stratos/kubernetes/client/interfaces/KubernetesAPIClientInterface.java
----------------------------------------------------------------------
diff --git
a/components/org.apache.stratos.kubernetes.client/src/main/java/org/apache/stratos/kubernetes/client/interfaces/KubernetesAPIClientInterface.java
b/components/org.apache.stratos.kubernetes.client/src/main/java/org/apache/stratos/kubernetes/client/interfaces/KubernetesAPIClientInterface.java
index 4b20cf4..80d4b52 100644
---
a/components/org.apache.stratos.kubernetes.client/src/main/java/org/apache/stratos/kubernetes/client/interfaces/KubernetesAPIClientInterface.java
+++
b/components/org.apache.stratos.kubernetes.client/src/main/java/org/apache/stratos/kubernetes/client/interfaces/KubernetesAPIClientInterface.java
@@ -31,12 +31,12 @@ public interface KubernetesAPIClientInterface {
/**
* Create pod.
* @param podId
- * @param podName
+ * @param podLabel
* @param dockerImage
* @param ports
* @throws KubernetesClientException
*/
- public void createPod(String podId, String podName, String dockerImage,
List<Port> ports,
+ public void createPod(String podId, String podLabel, String
dockerImage, List<Port> ports,
EnvironmentVariable[] environmentVariables)
throws KubernetesClientException;
@@ -80,11 +80,11 @@ public interface KubernetesAPIClientInterface {
* @throws KubernetesClientException
*/
public void createReplicationController(String replicationControllerId,
-
String replicationControllerName,
-
String dockerImage,
-
List<Port> ports,
-
EnvironmentVariable[]
environmentVariables,
-
int replicas) throws
KubernetesClientException;
+ String replicationControllerName,
+ String dockerImage,
+ List<Port> ports,
+ EnvironmentVariable[]
environmentVariables,
+ int replicas) throws
KubernetesClientException;
/**
* Get a Replication Controller Info
@@ -118,13 +118,14 @@ public interface KubernetesAPIClientInterface {
/**
* Create service.
* @param serviceId
- * @param serviceName
+ * @param serviceLabel
* @param servicePort
* @param containerPortName
- * @throws KubernetesClientException
+ * @param publicIPs
+ * @throws KubernetesClientException
*/
- public void createService(String serviceId, String serviceName, int
servicePort,
- String
containerPortName) throws KubernetesClientException;
+ public void createService(String serviceId, String serviceLabel, int
servicePort,
+ String containerPortName, String[] publicIPs)
throws KubernetesClientException;
/**
* Get the Service with the given id.
http://git-wip-us.apache.org/repos/asf/stratos/blob/8a2de456/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 2d48724..a7fa5ad 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
@@ -35,8 +35,8 @@ import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.experimental.categories.Category;
+import java.io.IOException;
import java.net.Socket;
-import java.net.URL;
import java.util.ArrayList;
import java.util.List;
@@ -45,70 +45,93 @@ import java.util.List;
* Please ssh into the kubernetes custer and pull the docker image before
running
* the live tests. Otherwise tests would fail when running for the first time
on a fresh
* kubernetes cluster.
- *
+ * <p/>
* Caution!
* At the end of the tests it will remove all the replication controllers,
pods and services
* available in the given kubernetes environment.
*/
@Category(org.apache.stratos.kubernetes.client.LiveTests.class)
-public class KubernetesApiClientLiveTest extends TestCase{
+public class KubernetesApiClientLiveTest extends TestCase {
private static final Log log =
LogFactory.getLog(KubernetesApiClientLiveTest.class);
- private static final int DEFAULT_CONTAINER_PORT = 6379; //80;
- private static final int SERVICE_PORT = 4500;
- private static final String DEFAULT_KUBERNETES_MASTER_IP = "172.17.8.100";
+ private static final String DEFAULT_KUBERNETES_MASTER_IP = "172.17.8.101";
private static final int KUBERNETES_API_PORT = 8080;
- private static final String DEFAULT_DOCKER_IMAGE = "gurpartap/redis";
//"stratos/php:4.1.0-alpha";
+
+ private static final String DEFAULT_DOCKER_IMAGE = "fnichol/uhttpd";
+ private static final int DEFAULT_CONTAINER_PORT = 80;
+ private static final int SERVICE_PORT = 4500;
private static final int POD_ACTIVATION_WAIT_TIME = 10000; // 10 seconds
+ private static final String KUBERNETES_API_ENDPOINT =
"kubernetes.api.endpoint";
+ private static final String MINION_PUBLIC_IPS = "minion.public.ips";
+ private static final String DOCKER_IMAGE = "docker.image";
+ private static final String CONTAINER_PORT = "container.port";
+ private static final String TEST_SERVICE_SOCKET = "test.service.socket";
+ private static final String TEST_POD_ACTIVATION = "test.pod.activation";
+
private KubernetesApiClient client;
private String dockerImage;
private String endpoint;
private int containerPort;
private boolean testPodActivation;
- private boolean testProxyServiceSocket;
+ private boolean testServiceSocket;
+ private String[] minionPublicIPs = { "172.17.8.102" };
+ private List<String> podIdList = new ArrayList<String>();
+ private List<String> serviceIdList = new ArrayList<String>();
@BeforeClass
public void setUp() {
log.info("Setting up live test...");
- endpoint = System.getProperty("kubernetes.api.endpoint");
+ endpoint = System.getProperty(KUBERNETES_API_ENDPOINT);
if (endpoint == null) {
- endpoint = "http://" + DEFAULT_KUBERNETES_MASTER_IP + ":" +
KUBERNETES_API_PORT + "/api/" + KubernetesConstants.KUBERNETES_API_VERSION +
"/";
+ endpoint = "http://" + DEFAULT_KUBERNETES_MASTER_IP + ":" +
KUBERNETES_API_PORT + "/api/"
+ + KubernetesConstants.KUBERNETES_API_VERSION + "/";
}
- log.info("Kubernetes endpoint: " + endpoint);
+ log.info(KUBERNETES_API_ENDPOINT + ": " + endpoint);
client = new KubernetesApiClient(endpoint);
- dockerImage = System.getProperty("docker.image");
+ dockerImage = System.getProperty(DOCKER_IMAGE);
if (dockerImage == null) {
dockerImage = DEFAULT_DOCKER_IMAGE;
}
- log.info("Docker image: " + dockerImage);
+ log.info(DOCKER_IMAGE + ": " + dockerImage);
- String containerPortStr = System.getProperty("container.port");
- if(StringUtils.isNotBlank(containerPortStr)) {
+ String containerPortStr = System.getProperty(CONTAINER_PORT);
+ if (StringUtils.isNotBlank(containerPortStr)) {
containerPort = Integer.parseInt(containerPortStr);
} else {
containerPort = DEFAULT_CONTAINER_PORT;
}
+ log.info(CONTAINER_PORT + ": " + containerPort);
- String testPodActivationStr =
System.getProperty("test.pod.activation");
- if(StringUtils.isNotBlank(testPodActivationStr)) {
+ testPodActivation = false;
+ String testPodActivationStr = System.getProperty(TEST_POD_ACTIVATION);
+ if (StringUtils.isNotBlank(testPodActivationStr)) {
testPodActivation = Boolean.parseBoolean(testPodActivationStr);
}
+ log.info(TEST_POD_ACTIVATION + ": " + testPodActivation);
- String testProxyServiceSocketStr =
System.getProperty("test.proxy.service.socket");
- if(StringUtils.isNotBlank(testProxyServiceSocketStr)) {
- testProxyServiceSocket =
Boolean.parseBoolean(testProxyServiceSocketStr);
+ testServiceSocket = false;
+ String testServiceSocketStr = System.getProperty(TEST_SERVICE_SOCKET);
+ if (StringUtils.isNotBlank(testServiceSocketStr)) {
+ testServiceSocket = Boolean.parseBoolean(testServiceSocketStr);
}
- log.info("Live test setup completed");
+ log.info(TEST_SERVICE_SOCKET + ": " + testServiceSocket);
+
+ String minionPublicIPsStr = System.getProperty(MINION_PUBLIC_IPS);
+ if(StringUtils.isNotBlank(minionPublicIPsStr)) {
+ minionPublicIPs = minionPublicIPsStr.split(",");
+ }
+ log.info(MINION_PUBLIC_IPS + ": " + minionPublicIPsStr);
+ log.info("Kubernetes live test setup completed");
}
@AfterClass
public void tearDown() {
log.info("Cleaning kubernetes resources...");
- deletePods();
deleteServices();
+ deletePods();
log.info("Kubernetes resources cleaned");
}
@@ -116,42 +139,11 @@ public class KubernetesApiClientLiveTest extends TestCase{
public void testPodCreation() throws Exception {
log.info("Testing pod creation...");
- String podId = "stratos-test-pod-1";
- String podName = "stratos-test-pod";
- String containerPortName = "http-1";
-
- log.info("Creating pod: [pod-id] " + podId);
- List<Port> ports = createPorts(containerPortName);
- client.createPod(podId, podName, dockerImage, ports, null);
-
- Thread.sleep(2000);
- Pod pod = client.getPod(podId);
- assertNotNull(pod);
- log.info("Pod created successfully: [pod-id] " + podId);
+ createPod("stratos-test-pod-1", "stratos-test-pod", "http-1");
+ createPod("stratos-test-pod-2", "stratos-test-pod", "http-1");
- if(testPodActivation) {
- log.info("Waiting pod status to be changed to running: [pod-id] "
+ podId);
- Thread.sleep(POD_ACTIVATION_WAIT_TIME);
- pod = client.getPod(podId);
- assertNotNull(pod);
- assertEquals(KubernetesConstants.POD_STATUS_RUNNING,
pod.getCurrentState().getStatus());
- log.info("Pod state changed to running: [pod-id]" + pod.getId());
- }
-
- log.info("Deleting pod: " + pod.getId());
- client.deletePod(pod.getId());
- assertNull(client.getPod(pod.getId()));
- log.info("Pod deleted successfully: " + pod.getId());
- }
-
- private List<Port> createPorts(String containerPortName) {
- List<Port> ports = new ArrayList<Port>();
- Port port = new Port();
- port.setName(containerPortName);
- port.setContainerPort(containerPort);
- port.setHostPort(SERVICE_PORT);
- ports.add(port);
- return ports;
+ deletePod("stratos-test-pod-1");
+ deletePod("stratos-test-pod-2");
}
@Test
@@ -167,97 +159,130 @@ public class KubernetesApiClientLiveTest extends
TestCase{
public void testServiceCreation() throws Exception {
log.info("Testing service creation...");
- String podId = "stratos-test-pod-1";
- String podName = "stratos-test-pod";
- String serviceId = "tomcat-1-tomcat-domain-1";
- String serviceName = serviceId;
+ String serviceId = "tomcat-domain-1";
+ String serviceName = "stratos-test-pod";
String containerPortName = "http-1";
- String masterPublicIp = new URL(endpoint).getHost();
+ createService(serviceId, serviceName, SERVICE_PORT, containerPortName,
minionPublicIPs);
+
+ createPod("stratos-test-pod-1", serviceName, containerPortName);
+ createPod("stratos-test-pod-2", serviceName, containerPortName);
+
+ if (testServiceSocket) {
+ // test service accessibility
+ log.info(String.format("Connecting to service: [portal] %s:%d",
minionPublicIPs[0], SERVICE_PORT));
+ sleep(4000);
+ Socket socket = new Socket(minionPublicIPs[0], SERVICE_PORT);
+ assertTrue(socket.isConnected());
+ log.info(String.format("Connecting to service successful: [portal]
%s:%d", minionPublicIPs[0], SERVICE_PORT));
+ }
- log.info("Creating pod...");
+ deleteService(serviceId);
+
+ deletePod("stratos-test-pod-1");
+ deletePod("stratos-test-pod-2");
+ }
+
+ private void createPod(String podId, String podName, String
containerPortName) throws KubernetesClientException {
+ log.info("Creating pod: [pod] " + podId);
List<Port> ports = createPorts(containerPortName);
client.createPod(podId, podName, dockerImage, ports, null);
+ podIdList.add(podId);
- Thread.sleep(2000);
- Pod podCreated = client.getPod(podId);
- assertNotNull(podCreated);
- log.info("Pod created successfully");
+ sleep(2000);
+ Pod pod = client.getPod(podId);
+ assertNotNull(pod);
+ log.info("Pod created successfully: [pod] " + podId);
+
+ if (testPodActivation) {
+ boolean activated = false;
+ long startTime = System.currentTimeMillis();
+ while(!activated) {
+ if((System.currentTimeMillis() - startTime) >
POD_ACTIVATION_WAIT_TIME) {
+ log.info(String.format("Pod did not activate within %d
seconds: [pod] %s",
+ POD_ACTIVATION_WAIT_TIME/1000, podId));
+ break;
+ }
- log.info("Creating service...");
- client.createService(serviceId, serviceName, SERVICE_PORT,
containerPortName);
+ log.info("Waiting pod status to be changed to running: [pod] "
+ podId);
+ sleep(2000);
+ pod = client.getPod(podId);
+ if((pod != null) &&
(pod.getCurrentState().getStatus().equals(KubernetesConstants.POD_STATUS_RUNNING)))
{
+ activated = true;
+ log.info("Pod state changed to running: [pod]" +
pod.getId());
+ }
+ }
- Thread.sleep(2000);
- Service service = client.getService(serviceId);
- assertNotNull(service);
- log.info("Service creation successful");
+ assertNotNull(pod);
+ assertEquals(KubernetesConstants.POD_STATUS_RUNNING,
pod.getCurrentState().getStatus());
+ }
+ }
- // test recreation using same id
- log.info("Creating a service with an existing id...");
- client.createService(serviceId, serviceName, SERVICE_PORT,
containerPortName);
+ private void deletePod(String podId) throws KubernetesClientException {
+ log.info("Deleting pod: " + podId);
+ client.deletePod(podId);
+ podIdList.remove(podId);
- Thread.sleep(2000);
- service = client.getService(serviceId);
- assertNotNull(service);
- log.info("Service re-creation with an existing id successful");
+ assertNull(client.getPod(podId));
+ log.info("Pod deleted successfully: " + podId);
+ }
- if(testProxyServiceSocket) {
- // test service proxy is accessibility
- log.info("Connecting to service proxy...");
- Socket socket = new Socket(masterPublicIp, SERVICE_PORT);
- assertTrue(socket.isConnected());
- log.info("Connecting to service proxy successful");
+ public void deletePods() {
+ try {
+ for(String podId : podIdList) {
+ deletePod(podId);
+ }
+ } catch (KubernetesClientException e) {
+ log.error("Could not delete pods", e);
}
+ }
+
+ private void createService(String serviceId, String serviceName, int
servicePort, String containerPortName,
+ String[] publicIPs) throws
KubernetesClientException, InterruptedException, IOException {
+ log.info("Creating service...");
+ client.createService(serviceId, serviceName, servicePort,
containerPortName, publicIPs);
+ serviceIdList.add(serviceId);
+
+ sleep(1000);
+ Service service = client.getService(serviceId);
+ assertNotNull(service);
+ log.info("Service creation successful");
+ }
- log.info("Deleting service...");
+ private void deleteService(String serviceId) throws
KubernetesClientException {
+ log.info(String.format("Deleting service: [service] %s", serviceId));
client.deleteService(serviceId);
+ serviceIdList.remove(serviceId);
+
+ sleep(1000);
assertNull(client.getService(serviceId));
- log.info("Service deleted successfully");
+ log.info(String.format("Service deleted successfully: [service] %s",
serviceId));
}
public void deleteServices() {
try {
- int count = 0;
- List<Service> services = client.getServices();
- while((services != null) && (services.size() > 0)) {
- for (Service service : services) {
- if ((StringUtils.isNotBlank(service.getId())) &&
(!service.getId().contains("kubernetes"))) {
- client.deleteService(service.getId());
- count++;
- log.info(String.format("Service deleted: [service]
%s", service.getId()));
- }
- }
- services = client.getServices();
- }
-
- if(count > 0) {
- log.info(String.format("%d services deleted", count));
+ for(String serviceId : serviceIdList) {
+ deleteService(serviceId);
}
} catch (KubernetesClientException e) {
log.error("Could not delete services", e);
}
}
- public void deletePods() {
+ private void sleep(long time) {
try {
- int count = 0;
- List<Pod> pods = client.getPods();
- while ((pods != null) || (pods.size() > 0)) {
- for (Pod pod : pods) {
- if (StringUtils.isNotBlank(pod.getId())) {
- client.deletePod(pod.getId());
- count++;
- log.info(String.format("Pod deleted: [pod] %s",
pod.getId()));
- }
- }
- pods = client.getPods();
- }
-
- if(count > 0) {
- log.info(String.format("%d pods deleted", count));
- }
- } catch (KubernetesClientException e) {
- log.error("Could not delete pods", e);
+ Thread.sleep(time);
+ } catch (InterruptedException ignore) {
}
}
+
+ private List<Port> createPorts(String containerPortName) {
+ List<Port> ports = new ArrayList<Port>();
+ Port port = new Port();
+ port.setName(containerPortName);
+ port.setContainerPort(containerPort);
+ port.setProtocol("tcp");
+ ports.add(port);
+ return ports;
+ }
}