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 2015/01/22 06:34:57 UTC
[2/2] stratos git commit: Fixing service proxy port issue in
kubernetes client api and kubernetes IaaS
Fixing service proxy port issue in kubernetes client api and kubernetes IaaS
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/0c4bec76
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/0c4bec76
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/0c4bec76
Branch: refs/heads/master
Commit: 0c4bec76b0273f5a13fb758da3b3640204dc79ee
Parents: 2f0b904
Author: Imesh Gunaratne <im...@apache.org>
Authored: Thu Jan 22 11:04:44 2015 +0530
Committer: Imesh Gunaratne <im...@apache.org>
Committed: Thu Jan 22 11:04:44 2015 +0530
----------------------------------------------------------------------
.../applications/ApplicationUtils.java | 2 +-
.../cloud/controller/domain/PortMapping.java | 24 +-
.../iaases/kubernetes/KubernetesIaas.java | 33 +-
.../iaases/kubernetes/KubernetesIaasUtil.java | 68 +-
.../publisher/TopologyEventPublisher.java | 4 +-
.../messaging/topology/TopologyBuilder.java | 17 +-
.../pom.xml | 173 ++--
.../kubernetes/client/KubernetesApiClient.java | 85 +-
.../KubernetesAPIClientInterface.java | 12 +-
.../live/KubernetesApiClientLiveTest.java | 51 +-
.../util/converter/ObjectConverter.java | 4 +-
.../main/resources/CloudControllerService.wsdl | 793 ++++++++++---------
12 files changed, 640 insertions(+), 626 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/stratos/blob/0c4bec76/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/ApplicationUtils.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/ApplicationUtils.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/ApplicationUtils.java
index 9666c69..708f401 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/ApplicationUtils.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/ApplicationUtils.java
@@ -147,7 +147,7 @@ public class ApplicationUtils {
StringBuilder portMapBuilder = new StringBuilder();
PortMapping[] portMappings = cartridge.getPortMappings();
for (PortMapping portMapping : portMappings) {
- String port = portMapping.getPort();
+ int port = portMapping.getPort();
portMapBuilder.append(port).append("|");
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/0c4bec76/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/PortMapping.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/PortMapping.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/PortMapping.java
index b50ffc7..c1d991f 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/PortMapping.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/PortMapping.java
@@ -25,13 +25,14 @@ public class PortMapping implements Serializable{
private static final long serialVersionUID = -5387564414633460306L;
private String protocol;
- private String port;
- private String proxyPort;
+ private int port;
+ private int proxyPort;
+ private int kubernetesServicePort;
- public PortMapping(){
+ public PortMapping() {
}
- public PortMapping(String protocol, String port, String proxyPort){
+ public PortMapping(String protocol, int port, int proxyPort){
this.protocol = protocol;
this.port = port;
this.proxyPort = proxyPort;
@@ -45,19 +46,19 @@ public class PortMapping implements Serializable{
this.protocol = protocol;
}
- public String getPort() {
+ public int getPort() {
return port;
}
- public void setPort(String port) {
+ public void setPort(int port) {
this.port = port;
}
- public String getProxyPort() {
+ public int getProxyPort() {
return proxyPort;
}
- public void setProxyPort(String proxyPort) {
+ public void setProxyPort(int proxyPort) {
this.proxyPort = proxyPort;
}
@@ -66,4 +67,11 @@ public class PortMapping implements Serializable{
return "Protocol: " + protocol + ", Port: " + port + ", Proxy Port: " + proxyPort;
}
+ public void setKubernetesServicePort(int kubernetesServicePort) {
+ this.kubernetesServicePort = kubernetesServicePort;
+ }
+
+ public int getKubernetesServicePort() {
+ return kubernetesServicePort;
+ }
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/0c4bec76/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 ea2c5c9..f116ce9 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
@@ -362,15 +362,14 @@ public class KubernetesIaas extends Iaas {
// Create replication controller
String replicationControllerId = CloudControllerUtil.replaceDotsWithDash(memberContext.getMemberId());
- String replicationControllerName = replicationControllerId;
+ String replicationControllerName = memberContext.getClusterId();
String dockerImage = iaasProvider.getImage();
- List<Integer> containerPorts = KubernetesIaasUtil.prepareCartridgePorts(cartridge);
EnvironmentVariable[] environmentVariables = KubernetesIaasUtil.prepareEnvironmentVariables(
clusterContext, memberContext);
int replicas = 1;
kubernetesApi.createReplicationController(replicationControllerId, replicationControllerName,
- dockerImage, containerPorts, environmentVariables, replicas);
+ dockerImage, KubernetesIaasUtil.convertPortMappings(cartridge.getPortMappings()), environmentVariables, replicas);
if (log.isInfoEnabled()) {
log.info(String.format("Replication controller created successfully: [cartridge-type] %s [member-id] %s",
memberContext.getCartridgeType(), memberContext.getClusterId()));
@@ -400,9 +399,9 @@ public class KubernetesIaas extends Iaas {
throw new RuntimeException(message);
}
- List<PortMapping> portMappings = cartridge.getPortMappings();
- for (PortMapping portMapping : portMappings) {
- String serviceId = KubernetesIaasUtil.prepareKubernetesServiceId(
+ boolean kubernetesServicePortsAdded = false;
+ for (PortMapping portMapping : cartridge.getPortMappings()) {
+ String serviceId = KubernetesIaasUtil.generateKubernetesServiceId(
CloudControllerUtil.replaceDotsWithDash(clusterId), portMapping);
int nextServicePort = kubernetesClusterContext.getNextServicePort();
if (nextServicePort == -1) {
@@ -412,17 +411,16 @@ public class KubernetesIaas extends Iaas {
if (log.isInfoEnabled()) {
log.info(String.format("Creating kubernetes service: [cluster-id] %s [service-id] %s " +
- "[protocol] %s [service-port] %d [container-port] %s [proxy-port] %s", clusterId,
- serviceId, portMapping.getProtocol(), nextServicePort, portMapping.getPort(),
- portMapping.getProxyPort()));
+ "[protocol] %s [service-port] %d [container-port] %s", clusterId,
+ serviceId, portMapping.getProtocol(), nextServicePort, portMapping.getPort()));
}
- String serviceName = serviceId;
+ String serviceName = clusterId;
int servicePort = nextServicePort;
- int containerPort = Integer.parseInt(portMapping.getPort());
+ String containerPortName = KubernetesIaasUtil.generatePortName(portMapping);
String publicIp = kubernetesClusterContext.getMasterIp();
- kubernetesApi.createService(serviceId, serviceName, servicePort, containerPort, publicIp);
+ kubernetesApi.createService(serviceId, serviceName, servicePort, containerPortName, publicIp);
try {
Thread.sleep(1000);
@@ -431,14 +429,19 @@ public class KubernetesIaas extends Iaas {
Service service = kubernetesApi.getService(serviceId);
services.add(service);
+ portMapping.setKubernetesServicePort(nextServicePort);
+ kubernetesServicePortsAdded = true;
if (log.isInfoEnabled()) {
log.info(String.format("Kubernetes service successfully created: [cluster-id] %s [service-id] %s " +
- "[protocol] %s [service-port] %d [container-port] %s [proxy-port] %s", clusterId,
- service.getId(), portMapping.getProtocol(), service.getPort(), portMapping.getPort(),
- portMapping.getProxyPort()));
+ "[protocol] %s [service-port] %d [container-port] %s", clusterId,
+ serviceId, portMapping.getProtocol(), nextServicePort, portMapping.getPort()));
}
}
+ if(kubernetesServicePortsAdded) {
+ // Persist service ports added to port mappings
+ CloudControllerContext.getInstance().persist();
+ }
return services;
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/0c4bec76/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/kubernetes/KubernetesIaasUtil.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/kubernetes/KubernetesIaasUtil.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/kubernetes/KubernetesIaasUtil.java
index f10cb16..ba94359 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/kubernetes/KubernetesIaasUtil.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/kubernetes/KubernetesIaasUtil.java
@@ -21,7 +21,6 @@ package org.apache.stratos.cloud.controller.iaases.kubernetes;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.apache.stratos.cloud.controller.domain.Cartridge;
import org.apache.stratos.cloud.controller.domain.ClusterContext;
import org.apache.stratos.cloud.controller.domain.MemberContext;
import org.apache.stratos.cloud.controller.domain.PortMapping;
@@ -30,6 +29,7 @@ import org.apache.stratos.common.Property;
import org.apache.stratos.common.domain.NameValuePair;
import org.apache.stratos.common.constants.StratosConstants;
import org.apache.stratos.kubernetes.client.model.EnvironmentVariable;
+import org.apache.stratos.kubernetes.client.model.Port;
import java.util.ArrayList;
import java.util.List;
@@ -42,24 +42,11 @@ public class KubernetesIaasUtil {
private static final Log log = LogFactory.getLog(KubernetesIaas.class);
/**
- * Prepare and returns the list of ports defined in the given cartridge.
- * @param cartridge
- * @return
- */
- public static List<Integer> prepareCartridgePorts(Cartridge cartridge) {
- List<Integer> portList = new ArrayList<Integer>();
- for (PortMapping portMapping : cartridge.getPortMappings()) {
- portList.add(Integer.valueOf(portMapping.getPort()));
- }
- return portList;
- }
-
- /**
- * Prepare and returns kubernetes service id using clusterId, port protocol and port.
+ * Generate kubernetes service id using clusterId, port protocol and port.
* @param portMapping
* @return
*/
- public static String prepareKubernetesServiceId(String clusterId, PortMapping portMapping) {
+ public static String generateKubernetesServiceId(String clusterId, PortMapping portMapping) {
return String.format("%s-%s-%s", clusterId, portMapping.getProtocol(), portMapping.getPort());
}
@@ -105,23 +92,42 @@ public class KubernetesIaasUtil {
return environmentVariables.toArray(array);
}
- private static void addToEnvironment(List<EnvironmentVariable> envVars, String payload) {
- if (payload != null) {
- String[] entries = payload.split(",");
- for (String entry : entries) {
- String[] var = entry.split("=");
- if (var.length != 2) {
- continue;
- }
- addToEnvironmentVariables(envVars, var[0], var[1]);
- }
+ /**
+ * Add name value pair to kubernetes environment variables.
+ * @param environmentVariables
+ * @param name
+ * @param value
+ */
+ private static void addToEnvironmentVariables(List<EnvironmentVariable> environmentVariables, String name, String value) {
+ EnvironmentVariable environmentVariable = new EnvironmentVariable();
+ environmentVariable.setName(name);
+ environmentVariable.setValue(value);
+ environmentVariables.add(environmentVariable);
+ }
+
+ /**
+ * Convert stratos port mappings to kubernetes ports
+ * @param portMappings
+ * @return
+ */
+ public static List<Port> convertPortMappings(List<PortMapping> portMappings) {
+ List<Port> ports = new ArrayList<Port>();
+ for(PortMapping portMapping : portMappings) {
+ Port port = new Port();
+ port.setName(generatePortName(portMapping));
+ port.setContainerPort(portMapping.getPort());
+ port.setHostPort(portMapping.getKubernetesServicePort());
+ ports.add(port);
}
+ return ports;
}
- private static void addToEnvironmentVariables(List<EnvironmentVariable> envVars, String name, String value) {
- EnvironmentVariable var = new EnvironmentVariable();
- var.setName(name);
- var.setValue(value);
- envVars.add(var);
+ /**
+ * Generate port name for port mapping.
+ * @param portMapping
+ * @return
+ */
+ public static String generatePortName(PortMapping portMapping) {
+ return String.format("%s-%d", portMapping.getProtocol(), portMapping.getPort());
}
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/0c4bec76/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/messaging/publisher/TopologyEventPublisher.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/messaging/publisher/TopologyEventPublisher.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/messaging/publisher/TopologyEventPublisher.java
index c2a9ccf..48692a2 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/messaging/publisher/TopologyEventPublisher.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/messaging/publisher/TopologyEventPublisher.java
@@ -60,9 +60,7 @@ public class TopologyEventPublisher {
Port port;
List<PortMapping> portMappings = cartridge.getPortMappings();
for (PortMapping portMapping : portMappings) {
- port = new Port(portMapping.getProtocol(),
- Integer.parseInt(portMapping.getPort()),
- Integer.parseInt(portMapping.getProxyPort()));
+ port = new Port(portMapping.getProtocol(), portMapping.getPort(), portMapping.getProxyPort());
serviceCreatedEvent.addPort(port);
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/0c4bec76/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/messaging/topology/TopologyBuilder.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/messaging/topology/TopologyBuilder.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/messaging/topology/TopologyBuilder.java
index 6842d55..6a539a8 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/messaging/topology/TopologyBuilder.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/messaging/topology/TopologyBuilder.java
@@ -31,8 +31,6 @@ import org.apache.stratos.cloud.controller.util.CloudControllerUtil;
import org.apache.stratos.messaging.domain.application.ClusterDataHolder;
import org.apache.stratos.messaging.domain.instance.ClusterInstance;
import org.apache.stratos.messaging.domain.topology.*;
-import org.apache.stratos.messaging.domain.topology.Port;
-import org.apache.stratos.messaging.domain.topology.Service;
import org.apache.stratos.messaging.event.application.ApplicationInstanceTerminatedEvent;
import org.apache.stratos.messaging.event.cluster.status.*;
import org.apache.stratos.messaging.event.instance.status.InstanceActivatedEvent;
@@ -76,9 +74,7 @@ public class TopologyBuilder {
Port port;
//adding ports to the event
for (PortMapping portMapping : portMappings) {
- port = new Port(portMapping.getProtocol(),
- Integer.parseInt(portMapping.getPort()),
- Integer.parseInt(portMapping.getProxyPort()));
+ port = new Port(portMapping.getProtocol(), portMapping.getPort(), portMapping.getProxyPort());
service.addPort(port);
}
topology.addService(service);
@@ -429,8 +425,7 @@ public class TopologyBuilder {
// Adding ports to the member
for (PortMapping portMapping : portMappings) {
port = new Port(portMapping.getProtocol(),
- findServicePort(clusterId, services, portMapping),
- Integer.parseInt(portMapping.getProxyPort()));
+ findServicePort(clusterId, services, portMapping), portMapping.getProxyPort());
member.addPort(port);
}
}
@@ -439,9 +434,7 @@ public class TopologyBuilder {
} else {
// Adding ports to the member
for (PortMapping portMapping : portMappings) {
- port = new Port(portMapping.getProtocol(),
- Integer.parseInt(portMapping.getPort()),
- Integer.parseInt(portMapping.getProxyPort()));
+ port = new Port(portMapping.getProtocol(), portMapping.getPort(), portMapping.getProxyPort());
member.addPort(port);
}
}
@@ -639,9 +632,7 @@ public class TopologyBuilder {
Port port;
//adding ports to the event
for (PortMapping portMapping : portMappings) {
- port = new Port(portMapping.getProtocol(),
- Integer.parseInt(portMapping.getPort()),
- Integer.parseInt(portMapping.getProxyPort()));
+ port = new Port(portMapping.getProtocol(), portMapping.getPort(), portMapping.getProxyPort());
member.addPort(port);
memberActivatedEvent.addPort(port);
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/0c4bec76/components/org.apache.stratos.kubernetes.client/pom.xml
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.kubernetes.client/pom.xml b/components/org.apache.stratos.kubernetes.client/pom.xml
index 2c96345..b993575 100644
--- a/components/org.apache.stratos.kubernetes.client/pom.xml
+++ b/components/org.apache.stratos.kubernetes.client/pom.xml
@@ -18,7 +18,8 @@
under the License.
-->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<groupId>org.apache.stratos</groupId>
@@ -26,53 +27,53 @@
<version>4.1.0-SNAPSHOT</version>
</parent>
- <modelVersion>4.0.0</modelVersion>
- <artifactId>org.apache.stratos.kubernetes.client</artifactId>
- <packaging>bundle</packaging>
- <name>Apache Stratos - Kubernetes API Java Client</name>
- <description>A Java client library written for Kubernetes API</description>
- <url>http://apache.org</url>
-
- <properties>
- <kubernetes.api.endpoint>http://localhost:8080/api/v1beta1/</kubernetes.api.endpoint>
- <docker.image>gurpartap/redis</docker.image>
- </properties>
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>org.apache.stratos.kubernetes.client</artifactId>
+ <packaging>bundle</packaging>
+ <name>Apache Stratos - Kubernetes API Java Client</name>
+ <description>A Java client library written for Kubernetes API</description>
+ <url>http://apache.org</url>
- <dependencies>
- <dependency>
- <groupId>org.apache.commons</groupId>
- <artifactId>commons-lang3</artifactId>
- <version>3.1</version>
- </dependency>
- <dependency>
- <groupId>org.apache.httpcomponents.wso2</groupId>
- <artifactId>httpcore</artifactId>
- <version>4.3.0.wso2v1</version>
- </dependency>
- <dependency>
- <groupId>org.apache.httpcomponents.wso2</groupId>
- <artifactId>httpclient</artifactId>
- <version>4.2.5.wso2v1</version>
- </dependency>
- <dependency>
- <groupId>com.google.code.gson</groupId>
- <artifactId>gson</artifactId>
- <version>2.2.4</version>
- </dependency>
- <dependency>
- <groupId>commons-logging</groupId>
- <artifactId>commons-logging</artifactId>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <scope>test</scope>
- </dependency>
- </dependencies>
+ <properties>
+ <kubernetes.api.endpoint>http://localhost:8080/api/v1beta1/</kubernetes.api.endpoint>
+ <docker.image>gurpartap/redis</docker.image>
+ </properties>
- <build>
- <plugins>
- <plugin>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-lang3</artifactId>
+ <version>3.1</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.httpcomponents.wso2</groupId>
+ <artifactId>httpcore</artifactId>
+ <version>4.3.0.wso2v1</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.httpcomponents.wso2</groupId>
+ <artifactId>httpclient</artifactId>
+ <version>4.2.5.wso2v1</version>
+ </dependency>
+ <dependency>
+ <groupId>com.google.code.gson</groupId>
+ <artifactId>gson</artifactId>
+ <version>2.2.4</version>
+ </dependency>
+ <dependency>
+ <groupId>commons-logging</groupId>
+ <artifactId>commons-logging</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
@@ -84,44 +85,44 @@
</instructions>
</configuration>
</plugin>
- </plugins>
- </build>
-
- <profiles>
- <profile>
- <id>unit</id>
- <activation>
- <activeByDefault>true</activeByDefault>
- </activation>
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-surefire-plugin</artifactId>
- <configuration>
- <groups>org.apache.stratos.kubernetes.client.UnitTests</groups>
- </configuration>
- </plugin>
- </plugins>
- </build>
- </profile>
- <profile>
- <id>live</id>
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-surefire-plugin</artifactId>
- <configuration>
- <groups>org.apache.stratos.kubernetes.client.LiveTests</groups>
- <systemPropertyVariables>
- <kubernetes.api.endpoint>${kubernetes.api.endpoint}</kubernetes.api.endpoint>
- <docker.image>${docker.image}</docker.image>
- </systemPropertyVariables>
- </configuration>
- </plugin>
- </plugins>
- </build>
- </profile>
- </profiles>
+ </plugins>
+ </build>
+
+ <profiles>
+ <profile>
+ <id>unit</id>
+ <activation>
+ <activeByDefault>true</activeByDefault>
+ </activation>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <configuration>
+ <groups>org.apache.stratos.kubernetes.client.UnitTests</groups>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ <profile>
+ <id>live</id>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <configuration>
+ <groups>org.apache.stratos.kubernetes.client.LiveTests</groups>
+ <systemPropertyVariables>
+ <kubernetes.api.endpoint>${kubernetes.api.endpoint}</kubernetes.api.endpoint>
+ <docker.image>${docker.image}</docker.image>
+ </systemPropertyVariables>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ </profiles>
</project>
http://git-wip-us.apache.org/repos/asf/stratos/blob/0c4bec76/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 ed71728..dc068c2 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
@@ -49,11 +49,11 @@ public class KubernetesApiClient implements KubernetesAPIClientInterface {
}
@Override
- public void createPod(String podId, String podName, String dockerImage, List<Integer> containerPorts)
+ public void createPod(String podId, String podName, String dockerImage, List<Port> ports)
throws KubernetesClientException {
if (log.isInfoEnabled()) {
- log.info(String.format("Creating pod: [pod-id] %s [pod-name] %s [docker-image] %s [container-ports] %s",
- podId, podName, dockerImage, containerPorts));
+ log.info(String.format("Creating pod: [pod-id] %s [pod-name] %s [docker-image] %s [ports] %s",
+ podId, podName, dockerImage, ports));
}
// Create pod definition
@@ -76,7 +76,7 @@ public class KubernetesApiClient implements KubernetesAPIClientInterface {
Container containerTemplate = new Container();
containerTemplate.setName(podName);
containerTemplate.setImage(dockerImage);
- containerTemplate.setPorts(convertIntPortListToPortList(containerPorts));
+ containerTemplate.setPorts(ports);
containerTemplate.setImagePullPolicy(KubernetesConstants.POLICY_PULL_IF_NOT_PRESENT);
manifest.addContainer(containerTemplate);
@@ -137,9 +137,9 @@ public class KubernetesApiClient implements KubernetesAPIClientInterface {
PodList result = gson.fromJson(content, PodList.class);
List<Pod> podList = new ArrayList<Pod>();
- if((result != null) && (result.getItems() != null)) {
- for(Pod pod : result.getItems()) {
- if(pod != null) {
+ if ((result != null) && (result.getItems() != null)) {
+ for (Pod pod : result.getItems()) {
+ if (pod != null) {
podList.add(pod);
}
}
@@ -171,7 +171,8 @@ public class KubernetesApiClient implements KubernetesAPIClientInterface {
if (response.getStatusCode() != HttpStatus.SC_ACCEPTED &&
response.getStatusCode() != HttpStatus.SC_OK) {
- String msg = String.format("Could not create pod: [pod-id] %s [message] %s", pod.getId());
+ String msg = String.format("Could not create pod: [pod-id] %s [message] %s", pod.getId(),
+ response.getKubernetesResponse().getMessage());
log.error(msg);
throw new KubernetesClientException(msg);
}
@@ -187,7 +188,7 @@ public class KubernetesApiClient implements KubernetesAPIClientInterface {
@Override
public void deletePod(String podId) throws KubernetesClientException {
try {
- if(log.isInfoEnabled()) {
+ if (log.isInfoEnabled()) {
log.info(String.format("Deleting pod: [pod-id] %s", podId));
}
@@ -210,7 +211,7 @@ public class KubernetesApiClient implements KubernetesAPIClientInterface {
throw new KubernetesClientException(message);
}
- if(log.isInfoEnabled()) {
+ if (log.isInfoEnabled()) {
log.info(String.format("Pod deleted successfully: [pod-id] %s", podId));
}
} catch (KubernetesClientException e) {
@@ -271,7 +272,7 @@ public class KubernetesApiClient implements KubernetesAPIClientInterface {
ReplicationControllerList controllerList = gson.fromJson(content, ReplicationControllerList.class);
List<ReplicationController> replicationControllers = new ArrayList<ReplicationController>();
- if((controllerList != null) && (controllerList.getItems() != null)) {
+ if ((controllerList != null) && (controllerList.getItems() != null)) {
for (ReplicationController replicationController : controllerList.getItems()) {
if (replicationController != null) {
replicationControllers.add(replicationController);
@@ -288,13 +289,13 @@ public class KubernetesApiClient implements KubernetesAPIClientInterface {
@Override
public void createReplicationController(String replicationControllerId, String replicationControllerName,
- String dockerImage, List<Integer> containerPorts,
+ String dockerImage, List<Port> ports,
EnvironmentVariable[] environmentVariables, int replicas) throws KubernetesClientException {
try {
if (log.isInfoEnabled()) {
log.info(String.format("Creating replication controller: [replication-controller-id] %s [name] %s " +
- "[docker-image] %s [container-ports] %s [replicas] %d", replicationControllerId, replicationControllerName,
- dockerImage, containerPorts, replicas));
+ "[docker-image] %s [ports] %s [replicas] %d", replicationControllerId, replicationControllerName,
+ dockerImage, ports, replicas));
}
// Create replication controller
@@ -323,12 +324,12 @@ public class KubernetesApiClient implements KubernetesAPIClientInterface {
containerTemplate.setName(replicationControllerName);
containerTemplate.setImage(dockerImage);
containerTemplate.setImagePullPolicy(KubernetesConstants.POLICY_PULL_IF_NOT_PRESENT);
- if(environmentVariables != null) {
+ if (environmentVariables != null) {
containerTemplate.setEnv(environmentVariables);
}
// Set container ports
- List<Port> ports = convertIntPortListToPortList(containerPorts);
+// List<Port> ports = convertIntPortListToPortList(portMappings);
containerTemplate.setPorts(ports);
manifest.addContainer(containerTemplate);
@@ -352,8 +353,8 @@ public class KubernetesApiClient implements KubernetesAPIClientInterface {
if (log.isInfoEnabled()) {
log.info(String.format("Replication controller created successfully: [replication-controller-id] " +
- "%s [name] %s [docker-image] %s [container-port] %s [replicas] %d",
- replicationControllerId, replicationControllerName, dockerImage, containerPorts, replicas));
+ "%s [name] %s [docker-image] %s [port-mappings] %s [replicas] %d",
+ replicationControllerId, replicationControllerName, dockerImage, ports, replicas));
}
} catch (Exception e) {
String message = "Could not create replication controller: [replication-controller-id] " + replicationControllerId;
@@ -362,19 +363,6 @@ public class KubernetesApiClient implements KubernetesAPIClientInterface {
}
}
- private List<Port> convertIntPortListToPortList(List<Integer> containerPorts) {
- List<Port> ports = new ArrayList<Port>();
- for (int containerPort : containerPorts) {
- Port port = new Port();
- port.setContainerPort(containerPort);
- // A known issue related to setting host port:
- // https://github.com/openshift/origin/issues/210
- port.setHostPort(containerPort);
- ports.add(port);
- }
- return ports;
- }
-
private void createReplicationController(ReplicationController replicationController)
throws KubernetesClientException {
@@ -460,7 +448,7 @@ public class KubernetesApiClient implements KubernetesAPIClientInterface {
throws KubernetesClientException {
try {
- if(log.isInfoEnabled()) {
+ if (log.isInfoEnabled()) {
log.info("Deleting replication controller: [replication-controller-id] " +
replicationControllerId);
}
@@ -486,7 +474,7 @@ public class KubernetesApiClient implements KubernetesAPIClientInterface {
throw new KubernetesClientException(message);
}
- if(log.isInfoEnabled()) {
+ if (log.isInfoEnabled()) {
log.info("Replication controller deleted successfully: [replication-controller-id] " +
replicationControllerId);
}
@@ -505,20 +493,21 @@ public class KubernetesApiClient implements KubernetesAPIClientInterface {
@Override
public void createService(String serviceId, String serviceName, int servicePort,
- int containerPort, String publicIp) throws KubernetesClientException {
+ String containerPortName, String publicIp) throws KubernetesClientException {
try {
if (log.isInfoEnabled()) {
log.info(String.format("Creating service: [service-id] %s [service-name] %s [service-port] %d " +
- "[container-port] %d, [public-ip] %s", serviceId, serviceName, servicePort, containerPort, publicIp));
+ "[container-port-name] %s, [public-ip] %s", serviceId, serviceName, servicePort,
+ containerPortName, publicIp));
}
// Create service definition
Service service = new Service();
service.setApiVersion(KubernetesConstants.KUBERNETES_API_VERSION);
- service.setContainerPort(String.valueOf(containerPort));
- service.setPort(servicePort);
- service.setId(serviceId);
service.setKind(KubernetesConstants.KIND_SERVICE);
+ service.setId(serviceId);
+ service.setPort(servicePort);
+ service.setContainerPort(containerPortName);
service.setPublicIPs(new String[]{publicIp});
// Set service labels
@@ -537,11 +526,11 @@ public class KubernetesApiClient implements KubernetesAPIClientInterface {
if (log.isInfoEnabled()) {
log.info(String.format("Service created successfully: [service-id] %s [service-name] %s [service-port] %d " +
- "[container-port] %d, [public-ip] %s", serviceId, serviceName, servicePort, containerPort, publicIp));
+ "[container-port-name] %s, [public-ip] %s", serviceId, serviceName, servicePort, containerPortName, publicIp));
}
} catch (Exception e) {
String message = String.format("Service created successfully: [service-id] %s [service-name] %s [service-port] %d " +
- "[container-port] %d, [public-ip] %s", serviceId, serviceName, servicePort, containerPort, publicIp);
+ "[container-port-name] %s, [public-ip] %s", serviceId, serviceName, servicePort, containerPortName, publicIp);
log.error(message, e);
throw new KubernetesClientException(message, e);
}
@@ -594,9 +583,9 @@ public class KubernetesApiClient implements KubernetesAPIClientInterface {
ServiceList result = gson.fromJson(content, ServiceList.class);
List<Service> serviceList = new ArrayList<Service>();
- if((result != null) && (result.getItems() != null)) {
- for(Service pod : result.getItems()) {
- if(pod != null) {
+ if ((result != null) && (result.getItems() != null)) {
+ for (Service pod : result.getItems()) {
+ if (pod != null) {
serviceList.add(pod);
}
}
@@ -651,7 +640,7 @@ public class KubernetesApiClient implements KubernetesAPIClientInterface {
throws KubernetesClientException {
try {
- if(log.isInfoEnabled()) {
+ if (log.isInfoEnabled()) {
log.info(String.format("Deleting service: [service-id] %s", serviceId));
}
@@ -674,7 +663,7 @@ public class KubernetesApiClient implements KubernetesAPIClientInterface {
throw new KubernetesClientException(msg);
}
- if(log.isInfoEnabled()) {
+ if (log.isInfoEnabled()) {
log.info(String.format("Service deleted successfully: [service-id] %s", serviceId));
}
} catch (KubernetesClientException e) {
@@ -707,9 +696,9 @@ public class KubernetesApiClient implements KubernetesAPIClientInterface {
PodList result = gson.fromJson(content, PodList.class);
List<Pod> podList = new ArrayList<Pod>();
- if((result != null) && (result.getItems() != null)) {
- for(Pod pod : result.getItems()) {
- if(pod != null) {
+ if ((result != null) && (result.getItems() != null)) {
+ for (Pod pod : result.getItems()) {
+ if (pod != null) {
podList.add(pod);
}
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/0c4bec76/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 232e1e0..9315379 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
@@ -33,10 +33,10 @@ public interface KubernetesAPIClientInterface {
* @param podId
* @param podName
* @param dockerImage
- * @param containerPorts
+ * @param ports
* @throws KubernetesClientException
*/
- public void createPod(String podId, String podName, String dockerImage, List<Integer> containerPorts)
+ public void createPod(String podId, String podName, String dockerImage, List<Port> ports)
throws KubernetesClientException;
/**
@@ -74,14 +74,14 @@ public interface KubernetesAPIClientInterface {
* @param replicationControllerId
* @param replicationControllerName
* @param dockerImage
- * @param containerPorts
+ * @param ports
* @param replicas
* @throws KubernetesClientException
*/
public void createReplicationController(String replicationControllerId,
String replicationControllerName,
String dockerImage,
- List<Integer> containerPorts,
+ List<Port> ports,
EnvironmentVariable[] environmentVariables,
int replicas) throws KubernetesClientException;
@@ -119,12 +119,12 @@ public interface KubernetesAPIClientInterface {
* @param serviceId
* @param serviceName
* @param servicePort
- * @param containerPort
+ * @param containerPortName
* @param publicIp
* @throws KubernetesClientException
*/
public void createService(String serviceId, String serviceName, int servicePort,
- int containerPort, String publicIp) throws KubernetesClientException;
+ String containerPortName, String publicIp) throws KubernetesClientException;
/**
* Get the Service with the given id.
http://git-wip-us.apache.org/repos/asf/stratos/blob/0c4bec76/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 b077f87..6603b6d 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
@@ -26,33 +26,38 @@ 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.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.apache.stratos.kubernetes.client.model.*;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
import org.junit.experimental.categories.Category;
import java.net.InetAddress;
+import java.net.Socket;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
/**
* Notes:
- * Initially it would take some time to pull the docker image and create a pod.
- * As a result live test would fail when running for the first time on a fresh
+ * 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.
+ *
+ * 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{
private static final Log log = LogFactory.getLog(KubernetesApiClientLiveTest.class);
- private static final int CONTAINER_PORT = 6379;
+ private static final int CONTAINER_PORT = 80;
+ private static final int PROXY_PORT = 9280;
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 String DEFAULT_DOCKER_IMAGE = "stratos/php:4.1.0-alpha";
private static final int POD_ACTIVATION_WAIT_TIME = 10000; // 10 seconds
private KubernetesApiClient client;
@@ -88,8 +93,7 @@ public class KubernetesApiClientLiveTest extends TestCase{
String podId = "stratos-test-pod-1";
String podName = "stratos-test-pod";
- List<Integer> ports = new ArrayList<Integer>();
- ports.add(CONTAINER_PORT);
+ List<Port> ports = createPorts();
client.createPod(podId, podName, dockerImage, ports);
Thread.sleep(2000);
@@ -108,6 +112,16 @@ public class KubernetesApiClientLiveTest extends TestCase{
log.info("Pod deleted successfully: " + pod.getId());
}
+ private List<Port> createPorts() {
+ List<Port> ports = new ArrayList<Port>();
+ Port port = new Port();
+ port.setName("port-1");
+ port.setContainerPort(CONTAINER_PORT);
+ port.setHostPort(PROXY_PORT);
+ ports.add(port);
+ return ports;
+ }
+
@Test
public void testDeletingAnNonExistingPod() {
try {
@@ -123,8 +137,7 @@ public class KubernetesApiClientLiveTest extends TestCase{
String replicationControllerName = "stratos-test-rc";
int replicas = 2;
- List<Integer> ports = new ArrayList<Integer>();
- ports.add(CONTAINER_PORT);
+ List<Port> ports = createPorts();
client.createReplicationController(replicationControllerId, replicationControllerName,
dockerImage, ports, null, replicas);
@@ -164,26 +177,30 @@ public class KubernetesApiClientLiveTest extends TestCase{
InetAddress address = InetAddress.getByName(new URL(endpoint).getHost());
String publicIp = address.getHostAddress();
- List<Integer> ports = new ArrayList<Integer>();
- ports.add(CONTAINER_PORT);
+ List<Port> ports = createPorts();
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);
+ client.createService(serviceId, serviceName, SERVICE_PORT, "port-1", publicIp);
Thread.sleep(2000);
Service service = client.getService(serviceId);
+ assertNotNull(service);
// test recreation using same id
- client.createService(serviceId, serviceName, SERVICE_PORT, CONTAINER_PORT, publicIp);
+ client.createService(serviceId, serviceName, SERVICE_PORT, "port-1", publicIp);
Thread.sleep(2000);
service = client.getService(serviceId);
assertNotNull(service);
+ // test service proxy is accessibility
+ Socket socket = new Socket(publicIp, SERVICE_PORT);
+ assertTrue(socket.isConnected());
+
client.deleteService(serviceId);
assertNull(client.getService(serviceId));
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/0c4bec76/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/util/converter/ObjectConverter.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/util/converter/ObjectConverter.java b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/util/converter/ObjectConverter.java
index 4c956ce..6127349 100644
--- a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/util/converter/ObjectConverter.java
+++ b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/util/converter/ObjectConverter.java
@@ -128,8 +128,8 @@ public class ObjectConverter {
for (int i = 0; i < portMappingBeanArray.length; i++) {
PortMapping portMapping = new PortMapping();
portMapping.setProtocol(portMappingBeanArray[i].getProtocol());
- portMapping.setPort(Integer.toString(portMappingBeanArray[i].getPort()));
- portMapping.setProxyPort(Integer.toString(portMappingBeanArray[i].getProxyPort()));
+ portMapping.setPort(portMappingBeanArray[i].getPort());
+ portMapping.setProxyPort(portMappingBeanArray[i].getProxyPort());
portMappingArray[i] = portMapping;
}