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/22 12:06:25 UTC

stratos git commit: Fixing kubernetes service proxy creation logic

Repository: stratos
Updated Branches:
  refs/heads/master bf721e83b -> af0f6edd8


Fixing kubernetes service proxy creation logic


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

Branch: refs/heads/master
Commit: af0f6edd8ecd8ba5eeb8907f1a0d335a15333122
Parents: bf721e8
Author: Imesh Gunaratne <im...@apache.org>
Authored: Mon Dec 22 16:36:05 2014 +0530
Committer: Imesh Gunaratne <im...@apache.org>
Committed: Mon Dec 22 16:36:19 2014 +0530

----------------------------------------------------------------------
 ...inerClusterContextToKubernetesContainer.java |  7 +-
 .../cloud/controller/iaases/KubernetesIaas.java | 88 ++++++++++++--------
 .../impl/CloudControllerServiceImpl.java        |  7 +-
 .../impl/CloudControllerServiceUtil.java        | 12 +--
 .../controller/util/CloudControllerUtil.java    |  6 +-
 5 files changed, 71 insertions(+), 49 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/af0f6edd/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/ContainerClusterContextToKubernetesContainer.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/ContainerClusterContextToKubernetesContainer.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/ContainerClusterContextToKubernetesContainer.java
index 274ab75..5665d59 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/ContainerClusterContextToKubernetesContainer.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/ContainerClusterContextToKubernetesContainer.java
@@ -84,7 +84,7 @@ public class ContainerClusterContextToKubernetesContainer implements Function<Me
 
         for (PortMapping portMapping : cartridge.getPortMappings()) {
             Port p = new Port();
-            p.setName(p.getProtocol() + p.getContainerPort());
+            p.setName(p.getProtocol() + "-" + p.getContainerPort());
             // In kubernetes transport protocol always be 'tcp'
             p.setProtocol("tcp");
             p.setContainerPort(Integer.parseInt(portMapping.getPort()));
@@ -120,6 +120,11 @@ public class ContainerClusterContextToKubernetesContainer implements Function<Me
         addToEnvironmentVariables(environmentVariables, StratosConstants.KUBERNETES_CLUSTER_ID,
                 kubernetesClusterId);
 
+        if(log.isDebugEnabled()) {
+            log.debug(String.format("Environment variables: [cluster-id] %s [member-id] %s [variables] %s",
+                    memberContext.getClusterId(), memberContext.getMemberId(), environmentVariables.toString()));
+        }
+
         EnvironmentVariable[] array = new EnvironmentVariable[environmentVariables.size()];
         return environmentVariables.toArray(array);
     }

http://git-wip-us.apache.org/repos/asf/stratos/blob/af0f6edd/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/KubernetesIaas.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/KubernetesIaas.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/KubernetesIaas.java
index 7d495ce..2ae3a85 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/KubernetesIaas.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/KubernetesIaas.java
@@ -53,7 +53,7 @@ import java.util.concurrent.locks.Lock;
 public class KubernetesIaas extends Iaas {
 
     private static final Log log = LogFactory.getLog(KubernetesIaas.class);
-    private static final long POD_CREATION_TIMEOUT = 60000; // 1 min
+    private static final long POD_CREATION_TIMEOUT = 120000; // 1 min
     public static final String PAYLOAD_PARAMETER_SEPARATOR = ",";
     public static final String PAYLOAD_PARAMETER_NAME_VALUE_SEPARATOR = "=";
 
@@ -163,31 +163,36 @@ public class KubernetesIaas extends Iaas {
                         StratosConstants.KUBERNETES_MASTER_DEFAULT_PORT);
 
                 KubernetesClusterContext kubClusterContext = getKubernetesClusterContext(kubernetesClusterId,
-                        kubernetesMasterIp, kubernetesMasterPort, kubernetesPortRange.getLower(),
-                        kubernetesPortRange.getUpper());
+                        kubernetesMasterIp, kubernetesMasterPort, kubernetesPortRange.getUpper(),
+                        kubernetesPortRange.getLower());
 
                 // Get kubernetes API
                 KubernetesApiClient kubernetesApi = kubClusterContext.getKubApi();
 
-                // Create replication controller
-                createReplicationController(memberContext, clusterId, kubernetesApi);
-
                 // Create proxy services for port mappings
                 List<Service> services = createProxyServices(clusterContext, kubClusterContext, kubernetesApi);
                 clusterContext.setKubernetesServices(services);
                 CloudControllerContext.getInstance().updateClusterContext(clusterContext);
 
+                // Create replication controller
+                createReplicationController(memberContext, clusterId, kubernetesApi);
+
                 // Wait for pod to be created
-                Pod[] pods = waitForPodToBeCreated(memberContext, kubernetesApi);
-                if (pods.length != 1) {
+                List<Pod> pods = waitForPodToBeCreated(memberContext, kubernetesApi);
+                if (pods.size() != 1) {
                     if (log.isDebugEnabled()) {
                         log.debug(String.format("Pod did not create within %d sec, hence deleting the service: " +
                                 "[cluster-id] %s [member-id] %s", ((int)POD_CREATION_TIMEOUT/1000), clusterId, memberId));
                     }
-                    terminateContainers(clusterId);
-                    return null;
+                    try {
+                        terminateContainers(clusterId);
+                    } catch (Exception e) {
+                        String message = "Could not terminate containers which were partially created";
+                        log.error(message, e);
+                        throw new RuntimeException(message, e);
+                    }
                 }
-                Pod pod = pods[0];
+                Pod pod = pods.get(0);
                 if (log.isDebugEnabled()) {
                     log.debug(String.format("Pod created: [cluster-id] %s [member-id] %s [pod-id] %s",
                             clusterId, memberId, pod.getId()));
@@ -212,7 +217,8 @@ public class KubernetesIaas extends Iaas {
 
                 return newMemberContext;
             } catch (Exception e) {
-                String msg = "Could not start container: " + memberContext.toString() + " Cause: " + e.getMessage();
+                String msg = String.format("Could not start container: [cartridge-type] %s [member-id] %s",
+                        memberContext.getCartridgeType(), memberContext.getMemberId());
                 log.error(msg, e);
                 throw new IllegalStateException(msg, e);
             }
@@ -241,22 +247,29 @@ public class KubernetesIaas extends Iaas {
         return newMemberContext;
     }
 
-    private Pod[] waitForPodToBeCreated(MemberContext memberContext, KubernetesApiClient kubernetesApi) throws KubernetesClientException, InterruptedException {
+    private List<Pod> waitForPodToBeCreated(MemberContext memberContext, KubernetesApiClient kubernetesApi) throws KubernetesClientException, InterruptedException {
         Labels labels = new Labels();
-        labels.setName(memberContext.getMemberId());
-        Pod[] pods = new Pod[0];
+        labels.setName(memberContext.getClusterId());
+        List<Pod> podList = new ArrayList<Pod>();
         long startTime = System.currentTimeMillis();
-        while (pods.length == 1) {
-            pods = kubernetesApi.queryPods(new Labels[]{labels});
+        while (podList.size() == 0) {
+            Pod[] pods = kubernetesApi.queryPods(new Labels[]{labels});
+            if((pods != null) && (pods.length > 0)){
+                for(Pod pod : pods) {
+                    if(pod != null) {
+                        podList.add(pod);
+                    }
+                }
+            }
             if (log.isDebugEnabled()) {
-                log.debug("Member pod: [member-id] " + memberContext.getMemberId() + " [count] " + pods.length);
+                log.debug("Member pod: [member-id] " + memberContext.getMemberId() + " [count] " + podList.size());
             }
             if ((System.currentTimeMillis() - startTime) > POD_CREATION_TIMEOUT) {
                 break;
             }
             Thread.sleep(5000);
         }
-        return pods;
+        return podList;
     }
 
     /**
@@ -281,8 +294,8 @@ public class KubernetesIaas extends Iaas {
         // Create replication controller
         ReplicationController replicationController = controllerFunction.apply(memberContext);
         kubernetesApi.createReplicationController(replicationController);
-        if (log.isDebugEnabled()) {
-            log.debug("Kubernetes replication controller successfully created: [cluster-id] " + clusterId);
+        if (log.isInfoEnabled()) {
+            log.info("Kubernetes replication controller successfully created: [cluster-id] " + clusterId);
         }
         return replicationController;
     }
@@ -311,22 +324,27 @@ public class KubernetesIaas extends Iaas {
 
         List<PortMapping> portMappings = cartridge.getPortMappings();
         for(PortMapping portMapping : portMappings) {
-            if (log.isInfoEnabled()) {
-                log.info(String.format("Creating kubernetes service: [cluster-id] %s [protocol] %s [port] %s ",
-                        clusterId, portMapping.getProtocol(), portMapping.getPort()));
-            }
-
+            String serviceId = prepareKubernetesServiceId(clusterId, portMapping);
             int nextServicePort = kubernetesClusterContext.getNextServicePort();
             if(nextServicePort == -1) {
-                throw new RuntimeException("Service port not found");
+                throw new RuntimeException(String.format("Could not generate service port: [cluster-id] %s ",
+                        clusterContext.getClusterId()));
+            }
+
+            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()));
             }
 
             Service service = new Service();
-            service.setId(prepareKubernetesServiceId(clusterId, portMapping));
+            service.setId(serviceId);
             service.setApiVersion("v1beta1");
             service.setKind("Service");
             service.setPort(nextServicePort);
             service.setContainerPort(portMapping.getPort());
+
             Selector selector = new Selector();
             selector.setName(clusterId);
             service.setSelector(selector);
@@ -335,9 +353,10 @@ public class KubernetesIaas extends Iaas {
             services.add(service);
 
             if (log.isInfoEnabled()) {
-                log.info(String.format("Kubernetes service successfully created: [cluster-id] %s [protocol] %s " +
-                                "[port] %s [proxy-port] %s", clusterId, portMapping.getProtocol(),
-                        portMapping.getPort(), service.getPort()));
+                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()));
             }
         }
         return services;
@@ -345,12 +364,15 @@ public class KubernetesIaas extends Iaas {
 
     /**
      * Prepare kubernetes service id using clusterId, port protocol and port.
-     * @param clusterId
      * @param portMapping
      * @return
      */
     private String prepareKubernetesServiceId(String clusterId, PortMapping portMapping) {
-        return String.format("%s-%s-%s", clusterId, portMapping.getProtocol(), portMapping.getPort());
+        String serviceId = String.format("%s-%s-%s", clusterId, portMapping.getProtocol(), portMapping.getPort());
+        if(serviceId.contains(".")) {
+            serviceId = serviceId.replace(".", "-");
+        }
+        return serviceId;
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/stratos/blob/af0f6edd/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceImpl.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceImpl.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceImpl.java
index 9500920..6eff63f 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceImpl.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceImpl.java
@@ -1094,7 +1094,8 @@ public class CloudControllerServiceImpl implements CloudControllerService {
             lock = CloudControllerContext.getInstance().acquireKubernetesClusterWriteLock();
 
             if (log.isInfoEnabled()) {
-                log.info("Adding kubernetes cluster: " + kubernetesCluster);
+                log.info(String.format("Adding kubernetes cluster: [kubernetes-cluster-id] %s",
+                        kubernetesCluster.getClusterId()));
             }
             CloudControllerUtil.validateKubernetesCluster(kubernetesCluster);
 
@@ -1103,8 +1104,8 @@ public class CloudControllerServiceImpl implements CloudControllerService {
             CloudControllerContext.getInstance().persist();
 
             if (log.isInfoEnabled()) {
-                log.info(String.format("Kubernetes cluster added successfully: [id] %s, [description] %s",
-                        kubernetesCluster.getClusterId(), kubernetesCluster.getDescription()));
+                log.info(String.format("Kubernetes cluster added successfully: [kubernetes-cluster-id] %s",
+                        kubernetesCluster.getClusterId()));
             }
             return true;
         } catch (Exception e) {

http://git-wip-us.apache.org/repos/asf/stratos/blob/af0f6edd/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceUtil.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceUtil.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceUtil.java
index 23db8db..f86ec9d 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceUtil.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceUtil.java
@@ -90,20 +90,12 @@ public class CloudControllerServiceUtil {
     }
     
     public static IaasProvider validatePartitionAndGetIaasProvider(Partition partition, IaasProvider iaasProvider) throws InvalidPartitionException {
-        String provider = partition.getProvider();
-        Properties partitionProperties = CloudControllerUtil.toJavaUtilProperties(partition.getProperties());
-
-        if (CloudControllerConstants.KUBERNETES_PARTITION_PROVIDER.equals(provider)) {
-            // if this is a kubernetes based Partition
-            KubernetesPartitionValidator validator = new KubernetesPartitionValidator();
-            validator.validate(partition, partitionProperties);
-            return iaasProvider;
-
-        } else if (iaasProvider != null) {
+        if (iaasProvider != null) {
             // if this is a IaaS based partition
             Iaas iaas = iaasProvider.getIaas();
             PartitionValidator validator = iaas.getPartitionValidator();
             validator.setIaasProvider(iaasProvider);
+            Properties partitionProperties = CloudControllerUtil.toJavaUtilProperties(partition.getProperties());
             iaasProvider = validator.validate(partition, partitionProperties);
             return iaasProvider;
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/af0f6edd/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CloudControllerUtil.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CloudControllerUtil.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CloudControllerUtil.java
index d29d9d9..0bca0bd 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CloudControllerUtil.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CloudControllerUtil.java
@@ -392,8 +392,10 @@ public class CloudControllerUtil {
                 kubernetesCluster.getPortRange().getLower() > CloudControllerConstants.PORT_RANGE_MAX ||
                 kubernetesCluster.getPortRange().getLower() < CloudControllerConstants.PORT_RANGE_MIN ||
                 kubernetesCluster.getPortRange().getUpper() < kubernetesCluster.getPortRange().getLower()) {
-            throw new InvalidKubernetesClusterException("Port range is invalid " +
-                    "for the Kubernetes cluster [id]" + kubernetesCluster.getClusterId());
+            throw new InvalidKubernetesClusterException("Port range is invalid in kubernetes cluster " +
+                    "[kubenetes-cluster-id] " + kubernetesCluster.getClusterId() + " " +
+                    " [valid-min] " + CloudControllerConstants.PORT_RANGE_MIN + " [valid-max] " +
+                    CloudControllerConstants.PORT_RANGE_MAX);
         }
         try {
             validateKubernetesMaster(kubernetesCluster.getKubernetesMaster());