You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by ni...@apache.org on 2014/09/13 17:05:12 UTC

[1/3] git commit: Setting environment variables in a Container.

Repository: stratos
Updated Branches:
  refs/heads/docker-integration 5ab19f5d0 -> bedaac716


Setting environment variables in a Container.


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

Branch: refs/heads/docker-integration
Commit: f44689af9b57e936d3c5665d50df6df0428b0ac2
Parents: 5ab19f5
Author: Nirmal Fernando <ni...@gmail.com>
Authored: Sat Sep 13 08:10:20 2014 +0530
Committer: Nirmal Fernando <ni...@gmail.com>
Committed: Sat Sep 13 08:54:00 2014 +0530

----------------------------------------------------------------------
 .../ClusterContextToKubernetesContainer.java    | 45 ++++++++++++++++++++
 .../common/constants/StratosConstants.java      |  7 +++
 2 files changed, 52 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/f44689af/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/ClusterContextToKubernetesContainer.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/ClusterContextToKubernetesContainer.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/ClusterContextToKubernetesContainer.java
index a59e605..a38f5d6 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/ClusterContextToKubernetesContainer.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/ClusterContextToKubernetesContainer.java
@@ -20,6 +20,7 @@ package org.apache.stratos.cloud.controller.functions;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.UUID;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -27,11 +28,14 @@ import org.apache.stratos.cloud.controller.pojo.Cartridge;
 import org.apache.stratos.cloud.controller.pojo.ClusterContext;
 import org.apache.stratos.cloud.controller.pojo.KubernetesClusterContext;
 import org.apache.stratos.cloud.controller.pojo.PortMapping;
+import org.apache.stratos.cloud.controller.pojo.Property;
 import org.apache.stratos.cloud.controller.runtime.FasterLookUpDataHolder;
 import org.apache.stratos.cloud.controller.util.CloudControllerUtil;
 import org.apache.stratos.common.constants.StratosConstants;
 import org.apache.stratos.kubernetes.client.model.Container;
+import org.apache.stratos.kubernetes.client.model.EnvironmentVariable;
 import org.apache.stratos.kubernetes.client.model.Port;
+
 import com.google.common.base.Function;
 
 /**
@@ -82,5 +86,46 @@ public class ClusterContextToKubernetesContainer implements Function<ClusterCont
 		
 		return portList.toArray(ports);
 	}
+	
+	private String generateMemberId(String clusterId) {
+        UUID memberId = UUID.randomUUID();
+         return clusterId + memberId.toString();
+    }
+	
+	private EnvironmentVariable[] getEnvironmentVars(ClusterContext ctxt, Cartridge cartridge) {
+		
+		String kubernetesClusterId = CloudControllerUtil.getProperty(ctxt.getProperties(), 
+        		StratosConstants.KUBERNETES_CLUSTER_ID);
+		
+		List<EnvironmentVariable> envVars = new ArrayList<EnvironmentVariable>();
+		
+		addToEnvironment(envVars, StratosConstants.MEMBER_ID, generateMemberId(ctxt.getClusterId()));
+		addToEnvironment(envVars, StratosConstants.LB_CLUSTER_ID, generateMemberId(ctxt.getClusterId()));
+		addToEnvironment(envVars, StratosConstants.MEMBER_ID, generateMemberId(ctxt.getClusterId()));
+		addToEnvironment(envVars, StratosConstants.MEMBER_ID, generateMemberId(ctxt.getClusterId()));
+		// have to add memberID to the payload
+        StringBuilder payload = new StringBuilder(ctxt.getPayload());
+        addToPayload(payload, "MEMBER_ID", memberID);
+        addToPayload(payload, "LB_CLUSTER_ID", memberContext.getLbClusterId());
+        addToPayload(payload, "NETWORK_PARTITION_ID", memberContext.getNetworkPartitionId());
+        addToPayload(payload, StratosConstants.KUBERNETES_CLUSTER_ID, kubernetesClusterId);
+        if(memberContext.getProperties() != null) {
+        	org.apache.stratos.cloud.controller.pojo.Properties props1 = memberContext.getProperties();
+            if (props1 != null) {
+                for (Property prop : props1.getProperties()) {
+                    addToPayload(payload, prop.getName(), prop.getValue());
+                }
+            }
+        }
+	}
+
+	private void addToEnvironment(List<EnvironmentVariable> envVars,
+			String name, String value) {
+
+		EnvironmentVariable var = new EnvironmentVariable();
+		var.setName(name);
+		var.setValue(value);
+		envVars.add(var);
+	}
 
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/f44689af/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/constants/StratosConstants.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/constants/StratosConstants.java b/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/constants/StratosConstants.java
index b02a1cb..0d74172 100644
--- a/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/constants/StratosConstants.java
+++ b/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/constants/StratosConstants.java
@@ -140,6 +140,13 @@ public class StratosConstants {
     public static final String EMAIL_CONFIG= "email";
     public static final String MULTITENANCY_CONFIG_FOLDER = "multitenancy";
     
+    // Cloud controller - payload
+    public static final String MEMBER_ID= "MEMBER_ID";
+    public static final String LB_CLUSTER_ID= "LB_CLUSTER_ID";
+    public static final String NETWORK_PARTITION_ID= "NETWORK_PARTITION_ID";
+    
+    
+    
     // Kubernetes related constants
     public static final String KUBERNETES_CLUSTER_ID = "kubernetes.cluster.id";
     public static final String KUBERNETES_MASTER_IP = "kubernetes.master.ip";


[3/3] git commit: Implementing Kubernetes replication controller creation and service proxy creation - initial version.

Posted by ni...@apache.org.
Implementing Kubernetes replication controller creation and service proxy creation - initial version.


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

Branch: refs/heads/docker-integration
Commit: bedaac71648a30ef4212a7146e17f7a0034374bc
Parents: 39d161e
Author: Nirmal Fernando <ni...@gmail.com>
Authored: Sat Sep 13 20:30:37 2014 +0530
Committer: Nirmal Fernando <ni...@gmail.com>
Committed: Sat Sep 13 20:30:37 2014 +0530

----------------------------------------------------------------------
 .../MemberContextToKubernetesContainer.java     |  57 +++----
 .../MemberContextToReplicationController.java   |  24 ++-
 .../impl/CloudControllerServiceImpl.java        | 165 ++++++++++++++-----
 .../pojo/KubernetesClusterContext.java          |  62 ++++++-
 .../runtime/FasterLookUpDataHolder.java         |   6 +-
 .../controller/util/CloudControllerUtil.java    |   6 +
 6 files changed, 247 insertions(+), 73 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/bedaac71/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/MemberContextToKubernetesContainer.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/MemberContextToKubernetesContainer.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/MemberContextToKubernetesContainer.java
index a38f5d6..9ae4145 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/MemberContextToKubernetesContainer.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/MemberContextToKubernetesContainer.java
@@ -27,6 +27,7 @@ import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.cloud.controller.pojo.Cartridge;
 import org.apache.stratos.cloud.controller.pojo.ClusterContext;
 import org.apache.stratos.cloud.controller.pojo.KubernetesClusterContext;
+import org.apache.stratos.cloud.controller.pojo.MemberContext;
 import org.apache.stratos.cloud.controller.pojo.PortMapping;
 import org.apache.stratos.cloud.controller.pojo.Property;
 import org.apache.stratos.cloud.controller.runtime.FasterLookUpDataHolder;
@@ -39,16 +40,19 @@ import org.apache.stratos.kubernetes.client.model.Port;
 import com.google.common.base.Function;
 
 /**
- *	Is responsible for converting a {@link ClusterContext} object to a Kubernetes {@link Container}
+ *	Is responsible for converting a {@link MemberContext} object to a Kubernetes {@link Container}
  *	Object.
  */
-public class ClusterContextToKubernetesContainer implements Function<ClusterContext, Container>{
+public class MemberContextToKubernetesContainer implements Function<MemberContext, Container>{
 	
-	private static final Log log = LogFactory.getLog(ClusterContextToKubernetesContainer.class);
+	private static final Log log = LogFactory.getLog(MemberContextToKubernetesContainer.class);
 	private FasterLookUpDataHolder dataHolder = FasterLookUpDataHolder.getInstance();
 
 	@Override
-	public Container apply(ClusterContext clusterContext) {
+	public Container apply(MemberContext memberContext) {
+		String clusterId = memberContext.getClusterId();
+        ClusterContext clusterContext = dataHolder.getClusterContext(clusterId);
+        
 		Container container = new Container();
 		container.setName(clusterContext.getHostName());
 
@@ -64,21 +68,23 @@ public class ClusterContextToKubernetesContainer implements Function<ClusterCont
 		container.setImage(cartridge.getContainer().getImageName());
 
 		container.setPorts(getPorts(clusterContext, cartridge));
+		
+		container.setEnv(getEnvironmentVars(memberContext, clusterContext));
 
 		return container;
 	}
 	
 	private Port[] getPorts(ClusterContext ctxt, Cartridge cartridge) {
-		String kubernetesClusterId = CloudControllerUtil.getProperty(ctxt.getProperties(), 
-        		StratosConstants.KUBERNETES_CLUSTER_ID);
-		KubernetesClusterContext kubClusterContext = dataHolder.getKubernetesClusterContext(kubernetesClusterId);
+//		String kubernetesClusterId = CloudControllerUtil.getProperty(ctxt.getProperties(), 
+//        		StratosConstants.KUBERNETES_CLUSTER_ID);
+//		KubernetesClusterContext kubClusterContext = dataHolder.getKubernetesClusterContext(kubernetesClusterId);
 		Port[] ports = new Port[cartridge.getPortMappings().size()];
 		List<Port> portList = new ArrayList<Port>();
 		
 		for (PortMapping portMapping : cartridge.getPortMappings()) {
 			Port p = new Port();
 			p.setContainerPort(Integer.parseInt(portMapping.getPort()));
-			p.setHostPort(kubClusterContext.getAnAvailableHostPort());
+//			p.setHostPort(kubClusterContext.getAnAvailableHostPort());
 			p.setProtocol(portMapping.getProtocol());
 			p.setName(p.getProtocol()+p.getContainerPort());
 			portList.add(p);
@@ -87,36 +93,31 @@ public class ClusterContextToKubernetesContainer implements Function<ClusterCont
 		return portList.toArray(ports);
 	}
 	
-	private String generateMemberId(String clusterId) {
-        UUID memberId = UUID.randomUUID();
-         return clusterId + memberId.toString();
-    }
-	
-	private EnvironmentVariable[] getEnvironmentVars(ClusterContext ctxt, Cartridge cartridge) {
+	private EnvironmentVariable[] getEnvironmentVars(MemberContext memberCtxt, 
+			ClusterContext ctxt) {
 		
 		String kubernetesClusterId = CloudControllerUtil.getProperty(ctxt.getProperties(), 
         		StratosConstants.KUBERNETES_CLUSTER_ID);
 		
 		List<EnvironmentVariable> envVars = new ArrayList<EnvironmentVariable>();
-		
-		addToEnvironment(envVars, StratosConstants.MEMBER_ID, generateMemberId(ctxt.getClusterId()));
-		addToEnvironment(envVars, StratosConstants.LB_CLUSTER_ID, generateMemberId(ctxt.getClusterId()));
-		addToEnvironment(envVars, StratosConstants.MEMBER_ID, generateMemberId(ctxt.getClusterId()));
-		addToEnvironment(envVars, StratosConstants.MEMBER_ID, generateMemberId(ctxt.getClusterId()));
-		// have to add memberID to the payload
-        StringBuilder payload = new StringBuilder(ctxt.getPayload());
-        addToPayload(payload, "MEMBER_ID", memberID);
-        addToPayload(payload, "LB_CLUSTER_ID", memberContext.getLbClusterId());
-        addToPayload(payload, "NETWORK_PARTITION_ID", memberContext.getNetworkPartitionId());
-        addToPayload(payload, StratosConstants.KUBERNETES_CLUSTER_ID, kubernetesClusterId);
-        if(memberContext.getProperties() != null) {
-        	org.apache.stratos.cloud.controller.pojo.Properties props1 = memberContext.getProperties();
+		//FIXME member id, should it be unique for a container?
+		addToEnvironment(envVars, StratosConstants.MEMBER_ID, memberCtxt.getMemberId());
+		addToEnvironment(envVars, StratosConstants.LB_CLUSTER_ID, memberCtxt.getLbClusterId());
+		addToEnvironment(envVars, StratosConstants.NETWORK_PARTITION_ID, memberCtxt.getNetworkPartitionId());
+		addToEnvironment(envVars, StratosConstants.KUBERNETES_CLUSTER_ID, kubernetesClusterId);
+        if(memberCtxt.getProperties() != null) {
+        	org.apache.stratos.cloud.controller.pojo.Properties props1 = memberCtxt.getProperties();
             if (props1 != null) {
                 for (Property prop : props1.getProperties()) {
-                    addToPayload(payload, prop.getName(), prop.getValue());
+                	addToEnvironment(envVars, prop.getName(), prop.getValue());
                 }
             }
         }
+        
+        EnvironmentVariable[] vars = new EnvironmentVariable[envVars.size()];
+        
+        return envVars.toArray(vars);
+        
 	}
 
 	private void addToEnvironment(List<EnvironmentVariable> envVars,

http://git-wip-us.apache.org/repos/asf/stratos/blob/bedaac71/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/MemberContextToReplicationController.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/MemberContextToReplicationController.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/MemberContextToReplicationController.java
index 36141f2..9bc1cf9 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/MemberContextToReplicationController.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/MemberContextToReplicationController.java
@@ -19,6 +19,10 @@
 package org.apache.stratos.cloud.controller.functions;
 
 import org.apache.stratos.cloud.controller.pojo.ClusterContext;
+import org.apache.stratos.cloud.controller.pojo.MemberContext;
+import org.apache.stratos.cloud.controller.runtime.FasterLookUpDataHolder;
+import org.apache.stratos.cloud.controller.util.CloudControllerUtil;
+import org.apache.stratos.common.constants.StratosConstants;
 import org.apache.stratos.kubernetes.client.model.Container;
 import org.apache.stratos.kubernetes.client.model.Label;
 import org.apache.stratos.kubernetes.client.model.Manifest;
@@ -30,19 +34,27 @@ import org.apache.stratos.kubernetes.client.model.State;
 import com.google.common.base.Function;
 
 /**
- *	Is responsible for converting a {@link ClusterContext} object to a Kubernetes {@link ReplicationController}
+ *	Is responsible for converting a {@link MemberContext} object to a Kubernetes {@link ReplicationController}
  *	Object.
  */
-public class ClusterContextToReplicationController implements Function<ClusterContext, ReplicationController>{
+public class MemberContextToReplicationController implements Function<MemberContext, ReplicationController>{
 
+	private FasterLookUpDataHolder dataHolder = FasterLookUpDataHolder.getInstance();
+	
 	@Override
-	public ReplicationController apply(ClusterContext clusterContext) {
+	public ReplicationController apply(MemberContext memberContext) {
+		
+		String clusterId = memberContext.getClusterId();
+        ClusterContext clusterContext = dataHolder.getClusterContext(clusterId);
+        
 		ReplicationController contr = new ReplicationController();
 		contr.setId(clusterContext.getClusterId());
 		contr.setKind("ReplicationController");
 		contr.setApiVersion("v1beta1");
 		State desiredState = new State();
-		desiredState.setReplicas(3);
+		String minReplicas = CloudControllerUtil.getProperty(clusterContext.getProperties(), 
+				StratosConstants.KUBERNETES_MIN_REPLICAS);
+		desiredState.setReplicas(Integer.parseInt(minReplicas));
 		Selector selector = new Selector();
 		selector.setName(clusterContext.getClusterId());
 		desiredState.setReplicaSelector(selector);
@@ -53,8 +65,8 @@ public class ClusterContextToReplicationController implements Function<ClusterCo
 		manifest.setVersion("v1beta1");
 		manifest.setId(clusterContext.getClusterId());
 
-		ClusterContextToKubernetesContainer containerFunc = new ClusterContextToKubernetesContainer();
-		Container container = containerFunc.apply(clusterContext);
+		MemberContextToKubernetesContainer containerFunc = new MemberContextToKubernetesContainer();
+		Container container = containerFunc.apply(memberContext);
 
 		manifest.setContainers(new Container[] { container });
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/bedaac71/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/impl/CloudControllerServiceImpl.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/impl/CloudControllerServiceImpl.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/impl/CloudControllerServiceImpl.java
index 118daf4..fc1f504 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/impl/CloudControllerServiceImpl.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/impl/CloudControllerServiceImpl.java
@@ -28,7 +28,8 @@ import org.apache.stratos.cloud.controller.concurrent.PartitionValidatorCallable
 import org.apache.stratos.cloud.controller.concurrent.ThreadExecutor;
 import org.apache.stratos.cloud.controller.deployment.partition.Partition;
 import org.apache.stratos.cloud.controller.exception.*;
-import org.apache.stratos.cloud.controller.functions.ClusterContextToReplicationController;
+import org.apache.stratos.cloud.controller.functions.MemberContextToKubernetesService;
+import org.apache.stratos.cloud.controller.functions.MemberContextToReplicationController;
 import org.apache.stratos.cloud.controller.interfaces.CloudControllerService;
 import org.apache.stratos.cloud.controller.interfaces.Iaas;
 import org.apache.stratos.cloud.controller.persist.Deserializer;
@@ -43,6 +44,8 @@ import org.apache.stratos.cloud.controller.util.CloudControllerUtil;
 import org.apache.stratos.cloud.controller.validate.interfaces.PartitionValidator;
 import org.apache.stratos.common.constants.StratosConstants;
 import org.apache.stratos.kubernetes.client.KubernetesApiClient;
+import org.apache.stratos.kubernetes.client.model.ReplicationController;
+import org.apache.stratos.kubernetes.client.model.Service;
 import org.apache.stratos.messaging.domain.topology.Member;
 import org.apache.stratos.messaging.domain.topology.MemberStatus;
 import org.apache.stratos.messaging.util.Constants;
@@ -1290,17 +1293,6 @@ public class CloudControllerServiceImpl implements CloudControllerService {
             throw new IllegalArgumentException(msg);
         }
         
-        String kubernetesClusterId = CloudControllerUtil.getProperty(ctxt.getProperties(), 
-        		StratosConstants.KUBERNETES_CLUSTER_ID);
-        
-        if (kubernetesClusterId == null) {
-        	 String msg = "Instance start-up failed. Cannot find '"+
-        StratosConstants.KUBERNETES_CLUSTER_ID+"'. " + memberContext.toString();
-             log.error(msg);
-             throw new IllegalArgumentException(msg);
-        }
-        
-        KubernetesClusterContext kubClusterContext = dataHolder.getKubernetesClusterContext(kubernetesClusterId);
         
         String cartridgeType = ctxt.getCartridgeType();
 
@@ -1320,35 +1312,117 @@ public class CloudControllerServiceImpl implements CloudControllerService {
             // generating the Unique member ID...
             String memberID = generateMemberId(clusterId);
             memberContext.setMemberId(memberID);
-            // have to add memberID to the payload
-            StringBuilder payload = new StringBuilder(ctxt.getPayload());
-            addToPayload(payload, "MEMBER_ID", memberID);
-            addToPayload(payload, "LB_CLUSTER_ID", memberContext.getLbClusterId());
-            addToPayload(payload, "NETWORK_PARTITION_ID", memberContext.getNetworkPartitionId());
-            addToPayload(payload, StratosConstants.KUBERNETES_CLUSTER_ID, kubernetesClusterId);
-            if(memberContext.getProperties() != null) {
-            	org.apache.stratos.cloud.controller.pojo.Properties props1 = memberContext.getProperties();
-                if (props1 != null) {
-                    for (Property prop : props1.getProperties()) {
-                        addToPayload(payload, prop.getName(), prop.getValue());
-                    }
-                }
-            }
 
-            if (log.isDebugEnabled()) {
-                log.debug("Payload: " + payload.toString());
-            }
-            
+			
+			
+			String kubernetesClusterId = CloudControllerUtil.getProperty(ctxt.getProperties(), 
+					StratosConstants.KUBERNETES_CLUSTER_ID);
+			
+			if (kubernetesClusterId == null) {
+				String msg = "Instance start-up failed. Cannot find '"+
+						StratosConstants.KUBERNETES_CLUSTER_ID+"'. " + ctxt;
+				log.error(msg);
+				throw new IllegalArgumentException(msg);
+			}
+			
+			String kubernetesMasterIp = CloudControllerUtil.getProperty(memberContext.getProperties(), 
+					StratosConstants.KUBERNETES_MASTER_IP);
+			
+			if (kubernetesMasterIp == null) {
+				String msg = "Instance start-up failed. Cannot find '"+
+						StratosConstants.KUBERNETES_MASTER_IP+"'. " + memberContext;
+				log.error(msg);
+				throw new IllegalArgumentException(msg);
+			}
+			
+			String kubernetesPortRange = CloudControllerUtil.getProperty(memberContext.getProperties(), 
+					StratosConstants.KUBERNETES_PORT_RANGE);
+			
+			if (kubernetesPortRange == null) {
+				String msg = "Instance start-up failed. Cannot find '"+
+						StratosConstants.KUBERNETES_PORT_RANGE+"'. " + memberContext;
+				log.error(msg);
+				throw new IllegalArgumentException(msg);
+			}
+			
+			KubernetesClusterContext kubClusterContext = getKubernetesClusterContext(kubernetesClusterId, kubernetesMasterIp, kubernetesPortRange);
+			
+			if (kubClusterContext == null) {
+				
+			}
 
+			KubernetesApiClient client = kubClusterContext.getKubernetesApiClient();
+			
+			
+			// first let's create a replication controller.
+			MemberContextToReplicationController controllerFunction = new MemberContextToReplicationController();
+			ReplicationController controller = controllerFunction.apply(memberContext);
+			
 			if (log.isDebugEnabled()) {
-				log.debug("Cloud Controller is delegating request to start a container for "
-						+ memberContext + " to Kubernetes layer.");
+				log.debug("Cloud Controller is delegating request to start a replication controller "+controller+
+						" for "+ memberContext + " to Kubernetes layer.");
 			}
-
-            if (log.isDebugEnabled()) {
-				log.debug("Cloud Controller received a response for the request to start "
-						+ memberContext + " from Jclouds layer.");
+			
+			client.createReplicationController(controller);
+			
+			if (log.isDebugEnabled()) {
+				log.debug("Cloud Controller successfully starte the controller "
+						+ controller + " via Kubernetes layer.");
+			}
+			
+			// secondly let's create a kubernetes service proxy to load balance these containers
+			MemberContextToKubernetesService serviceFunction = new MemberContextToKubernetesService();
+			Service service = serviceFunction.apply(memberContext);
+			
+			if (log.isDebugEnabled()) {
+				log.debug("Cloud Controller is delegating request to start a service "+service+
+						" for "+ memberContext + " to Kubernetes layer.");
 			}
+			
+			client.createService(service);
+			
+			if (log.isDebugEnabled()) {
+				log.debug("Cloud Controller successfully starte the controller "
+						+ controller + " via Kubernetes layer.");
+			}
+			
+//			 try{
+//				 		memberContext.setPublicIpAddress();
+//	                    dataHolder.addMemberContext(memberContext);
+//
+//	                    // persist in registry
+//	                    persist();
+//
+//
+//	                    // trigger topology
+//	                    TopologyBuilder.handleMemberSpawned(cartridgeType, clusterId, 
+//	                    		partition.getId(), ip, publicIp, memberContext);
+//	                    
+//	                    String memberID = memberContext.getMemberId();
+//
+//	                    // update the topology with the newly spawned member
+//	                    // publish data
+//	                    CartridgeInstanceDataPublisher.publish(memberID,
+//	                                                        memberContext.getPartition().getId(),
+//	                                                        memberContext.getNetworkPartitionId(),
+//	                                                        memberContext.getClusterId(),
+//	                                                        cartridgeType,
+//	                                                        MemberStatus.Created.toString(),
+//	                                                        node);
+//	                    if (log.isDebugEnabled()) {
+//	                        log.debug("Node details: " + node.toString());
+//	                    }
+//	                    
+//	                    if (log.isDebugEnabled()) {
+//	        				log.debug("IP allocation process ended for "+memberContext);
+//	        			}
+//
+//	            } catch (Exception e) {
+//	                String msg = "Error occurred while allocating an ip address. " + memberContext.toString();
+//	                log.error(msg, e);
+//	                throw new CloudControllerException(msg, e);
+//	            } 
+
             
             
 //            //Start allocating ip as a new job
@@ -1395,7 +1469,7 @@ public class CloudControllerServiceImpl implements CloudControllerService {
 //				}
 //			}
 
-            log.info("Instance is successfully starting up. "+memberContext.toString());
+            log.info("Kubernetes entities are successfully starting up. "+memberContext.toString());
 
             return memberContext;
 
@@ -1405,5 +1479,22 @@ public class CloudControllerServiceImpl implements CloudControllerService {
             throw new IllegalStateException(msg, e);
         }
 	}
+
+	private KubernetesClusterContext getKubernetesClusterContext(
+			String kubernetesClusterId, String kubernetesMasterIp,
+			String kubernetesPortRange) {
+		
+		KubernetesClusterContext origCtxt = dataHolder.getKubernetesClusterContext(kubernetesClusterId);
+		KubernetesClusterContext newCtxt = new KubernetesClusterContext(kubernetesClusterId, kubernetesPortRange, kubernetesMasterIp);
+		
+		if (!origCtxt.equals(newCtxt)) {
+			// if for some reason master IP etc. have changed
+			newCtxt.setAvailableHostPorts(origCtxt.getAvailableHostPorts());
+			dataHolder.addKubernetesClusterContext(newCtxt);
+			return newCtxt;
+		} else {
+			return origCtxt;
+		}
+	}
 }
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/bedaac71/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/KubernetesClusterContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/KubernetesClusterContext.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/KubernetesClusterContext.java
index e501e56..c67d61a 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/KubernetesClusterContext.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/KubernetesClusterContext.java
@@ -40,15 +40,25 @@ public class KubernetesClusterContext implements Serializable {
     private String kubernetesClusterId;
     // available host port range, delimited by a hyphen
     private String hostPortRange;
+    // kubernetes master ip
+    private String masterIp;
     // available list of ports
     private List<Integer> availableHostPorts;
     // kubernetes client API instance
     private KubernetesApiClient kubernetesApiClient;
     
-    public KubernetesClusterContext() {
+    public KubernetesClusterContext(String id, String portRange, String masterIp) {
     	availableHostPorts = new ArrayList<Integer>();
+    	this.kubernetesClusterId = id;
+    	this.hostPortRange = portRange;
+    	this.masterIp = masterIp;
+    	kubernetesApiClient = new KubernetesApiClient(getEndpoint(masterIp));
 	}
     
+	private String getEndpoint(String ip) {
+		return "http://"+ip+":8080/api/v1beta1/";
+	}
+
 	public String getKubernetesClusterId() {
 		return kubernetesClusterId;
 	}
@@ -113,5 +123,55 @@ public class KubernetesClusterContext implements Serializable {
 	public void setKubernetesApiClient(KubernetesApiClient kubernetesApiClient) {
 		this.kubernetesApiClient = kubernetesApiClient;
 	}
+
+	public String getMasterIp() {
+		return masterIp;
+	}
+
+	public void setMasterIp(String masterIp) {
+		this.masterIp = masterIp;
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime * result
+				+ ((hostPortRange == null) ? 0 : hostPortRange.hashCode());
+		result = prime
+				* result
+				+ ((kubernetesClusterId == null) ? 0 : kubernetesClusterId
+						.hashCode());
+		result = prime * result
+				+ ((masterIp == null) ? 0 : masterIp.hashCode());
+		return result;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (obj == null)
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		KubernetesClusterContext other = (KubernetesClusterContext) obj;
+		if (hostPortRange == null) {
+			if (other.hostPortRange != null)
+				return false;
+		} else if (!hostPortRange.equals(other.hostPortRange))
+			return false;
+		if (kubernetesClusterId == null) {
+			if (other.kubernetesClusterId != null)
+				return false;
+		} else if (!kubernetesClusterId.equals(other.kubernetesClusterId))
+			return false;
+		if (masterIp == null) {
+			if (other.masterIp != null)
+				return false;
+		} else if (!masterIp.equals(other.masterIp))
+			return false;
+		return true;
+	}
     
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/bedaac71/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/runtime/FasterLookUpDataHolder.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/runtime/FasterLookUpDataHolder.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/runtime/FasterLookUpDataHolder.java
index 8aae06b..a8c47ce 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/runtime/FasterLookUpDataHolder.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/runtime/FasterLookUpDataHolder.java
@@ -399,10 +399,14 @@ public class FasterLookUpDataHolder implements Serializable{
 	public KubernetesClusterContext getKubernetesClusterContext(String kubClusterId) {
 		return kubClusterIdToKubClusterContext.get(kubClusterId);
 	}
+	
+	public void addKubernetesClusterContext(KubernetesClusterContext ctxt) {
+		this.kubClusterIdToKubClusterContext.put(ctxt.getKubernetesClusterId(), ctxt);
+	}
 
 	public void setKubClusterIdToKubClusterContext(
 			Map<String, KubernetesClusterContext> kubClusterIdToKubClusterContext) {
 		this.kubClusterIdToKubClusterContext = kubClusterIdToKubClusterContext;
 	}
-
+	
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/stratos/blob/bedaac71/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 8895d3e..213fedb 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
@@ -303,6 +303,12 @@ public class CloudControllerUtil {
     	return null;
     }
 	
+	public static String getProperty(org.apache.stratos.cloud.controller.pojo.Properties properties, String key) {
+		Properties props = toJavaUtilProperties(properties);
+		
+		return getProperty(props, key);
+	}
+	
 	/**
 	 * Converts org.apache.stratos.messaging.util.Properties to java.util.Properties
 	 * @param properties org.apache.stratos.messaging.util.Properties


[2/3] git commit: Refactoring functions to convert a MemberContext and adding a new function to convert a Member context to a Service.

Posted by ni...@apache.org.
Refactoring functions to convert a MemberContext and adding a new function to convert a Member context to a Service.


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

Branch: refs/heads/docker-integration
Commit: 39d161e11c5cb0f842660af9102606772cad6076
Parents: f44689a
Author: Nirmal Fernando <ni...@gmail.com>
Authored: Sat Sep 13 20:28:46 2014 +0530
Committer: Nirmal Fernando <ni...@gmail.com>
Committed: Sat Sep 13 20:28:46 2014 +0530

----------------------------------------------------------------------
 .../ClusterContextToKubernetesContainer.java    | 131 -------------------
 .../ClusterContextToReplicationController.java  |  77 -----------
 .../MemberContextToKubernetesContainer.java     | 131 +++++++++++++++++++
 .../MemberContextToKubernetesService.java       |  61 +++++++++
 .../MemberContextToReplicationController.java   |  77 +++++++++++
 5 files changed, 269 insertions(+), 208 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/39d161e1/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/ClusterContextToKubernetesContainer.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/ClusterContextToKubernetesContainer.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/ClusterContextToKubernetesContainer.java
deleted file mode 100644
index a38f5d6..0000000
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/ClusterContextToKubernetesContainer.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one 
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
- * KIND, either express or implied.  See the License for the 
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.stratos.cloud.controller.functions;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.UUID;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.stratos.cloud.controller.pojo.Cartridge;
-import org.apache.stratos.cloud.controller.pojo.ClusterContext;
-import org.apache.stratos.cloud.controller.pojo.KubernetesClusterContext;
-import org.apache.stratos.cloud.controller.pojo.PortMapping;
-import org.apache.stratos.cloud.controller.pojo.Property;
-import org.apache.stratos.cloud.controller.runtime.FasterLookUpDataHolder;
-import org.apache.stratos.cloud.controller.util.CloudControllerUtil;
-import org.apache.stratos.common.constants.StratosConstants;
-import org.apache.stratos.kubernetes.client.model.Container;
-import org.apache.stratos.kubernetes.client.model.EnvironmentVariable;
-import org.apache.stratos.kubernetes.client.model.Port;
-
-import com.google.common.base.Function;
-
-/**
- *	Is responsible for converting a {@link ClusterContext} object to a Kubernetes {@link Container}
- *	Object.
- */
-public class ClusterContextToKubernetesContainer implements Function<ClusterContext, Container>{
-	
-	private static final Log log = LogFactory.getLog(ClusterContextToKubernetesContainer.class);
-	private FasterLookUpDataHolder dataHolder = FasterLookUpDataHolder.getInstance();
-
-	@Override
-	public Container apply(ClusterContext clusterContext) {
-		Container container = new Container();
-		container.setName(clusterContext.getHostName());
-
-		Cartridge cartridge = dataHolder.getCartridge(clusterContext
-				.getCartridgeType());
-		
-		if (cartridge == null) {
-			log.error("Cannot find a Cartridge of type : "
-					+ clusterContext.getCartridgeType());
-			return null;
-		}
-		
-		container.setImage(cartridge.getContainer().getImageName());
-
-		container.setPorts(getPorts(clusterContext, cartridge));
-
-		return container;
-	}
-	
-	private Port[] getPorts(ClusterContext ctxt, Cartridge cartridge) {
-		String kubernetesClusterId = CloudControllerUtil.getProperty(ctxt.getProperties(), 
-        		StratosConstants.KUBERNETES_CLUSTER_ID);
-		KubernetesClusterContext kubClusterContext = dataHolder.getKubernetesClusterContext(kubernetesClusterId);
-		Port[] ports = new Port[cartridge.getPortMappings().size()];
-		List<Port> portList = new ArrayList<Port>();
-		
-		for (PortMapping portMapping : cartridge.getPortMappings()) {
-			Port p = new Port();
-			p.setContainerPort(Integer.parseInt(portMapping.getPort()));
-			p.setHostPort(kubClusterContext.getAnAvailableHostPort());
-			p.setProtocol(portMapping.getProtocol());
-			p.setName(p.getProtocol()+p.getContainerPort());
-			portList.add(p);
-		}
-		
-		return portList.toArray(ports);
-	}
-	
-	private String generateMemberId(String clusterId) {
-        UUID memberId = UUID.randomUUID();
-         return clusterId + memberId.toString();
-    }
-	
-	private EnvironmentVariable[] getEnvironmentVars(ClusterContext ctxt, Cartridge cartridge) {
-		
-		String kubernetesClusterId = CloudControllerUtil.getProperty(ctxt.getProperties(), 
-        		StratosConstants.KUBERNETES_CLUSTER_ID);
-		
-		List<EnvironmentVariable> envVars = new ArrayList<EnvironmentVariable>();
-		
-		addToEnvironment(envVars, StratosConstants.MEMBER_ID, generateMemberId(ctxt.getClusterId()));
-		addToEnvironment(envVars, StratosConstants.LB_CLUSTER_ID, generateMemberId(ctxt.getClusterId()));
-		addToEnvironment(envVars, StratosConstants.MEMBER_ID, generateMemberId(ctxt.getClusterId()));
-		addToEnvironment(envVars, StratosConstants.MEMBER_ID, generateMemberId(ctxt.getClusterId()));
-		// have to add memberID to the payload
-        StringBuilder payload = new StringBuilder(ctxt.getPayload());
-        addToPayload(payload, "MEMBER_ID", memberID);
-        addToPayload(payload, "LB_CLUSTER_ID", memberContext.getLbClusterId());
-        addToPayload(payload, "NETWORK_PARTITION_ID", memberContext.getNetworkPartitionId());
-        addToPayload(payload, StratosConstants.KUBERNETES_CLUSTER_ID, kubernetesClusterId);
-        if(memberContext.getProperties() != null) {
-        	org.apache.stratos.cloud.controller.pojo.Properties props1 = memberContext.getProperties();
-            if (props1 != null) {
-                for (Property prop : props1.getProperties()) {
-                    addToPayload(payload, prop.getName(), prop.getValue());
-                }
-            }
-        }
-	}
-
-	private void addToEnvironment(List<EnvironmentVariable> envVars,
-			String name, String value) {
-
-		EnvironmentVariable var = new EnvironmentVariable();
-		var.setName(name);
-		var.setValue(value);
-		envVars.add(var);
-	}
-
-}

http://git-wip-us.apache.org/repos/asf/stratos/blob/39d161e1/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/ClusterContextToReplicationController.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/ClusterContextToReplicationController.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/ClusterContextToReplicationController.java
deleted file mode 100644
index 36141f2..0000000
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/ClusterContextToReplicationController.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one 
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
- * KIND, either express or implied.  See the License for the 
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.stratos.cloud.controller.functions;
-
-import org.apache.stratos.cloud.controller.pojo.ClusterContext;
-import org.apache.stratos.kubernetes.client.model.Container;
-import org.apache.stratos.kubernetes.client.model.Label;
-import org.apache.stratos.kubernetes.client.model.Manifest;
-import org.apache.stratos.kubernetes.client.model.Pod;
-import org.apache.stratos.kubernetes.client.model.ReplicationController;
-import org.apache.stratos.kubernetes.client.model.Selector;
-import org.apache.stratos.kubernetes.client.model.State;
-
-import com.google.common.base.Function;
-
-/**
- *	Is responsible for converting a {@link ClusterContext} object to a Kubernetes {@link ReplicationController}
- *	Object.
- */
-public class ClusterContextToReplicationController implements Function<ClusterContext, ReplicationController>{
-
-	@Override
-	public ReplicationController apply(ClusterContext clusterContext) {
-		ReplicationController contr = new ReplicationController();
-		contr.setId(clusterContext.getClusterId());
-		contr.setKind("ReplicationController");
-		contr.setApiVersion("v1beta1");
-		State desiredState = new State();
-		desiredState.setReplicas(3);
-		Selector selector = new Selector();
-		selector.setName(clusterContext.getClusterId());
-		desiredState.setReplicaSelector(selector);
-
-		Pod podTemplate = new Pod();
-		State podState = new State();
-		Manifest manifest = new Manifest();
-		manifest.setVersion("v1beta1");
-		manifest.setId(clusterContext.getClusterId());
-
-		ClusterContextToKubernetesContainer containerFunc = new ClusterContextToKubernetesContainer();
-		Container container = containerFunc.apply(clusterContext);
-
-		manifest.setContainers(new Container[] { container });
-
-		podState.setManifest(manifest);
-		podTemplate.setDesiredState(podState);
-		Label l1 = new Label();
-		l1.setName(clusterContext.getClusterId());
-		podTemplate.setLabels(l1);
-
-		desiredState.setPodTemplate(podTemplate);
-		contr.setDesiredState(desiredState);
-
-		Label l2 = new Label();
-		l2.setName(clusterContext.getClusterId());
-		contr.setLabels(l2);
-
-		return contr;
-	}
-
-}

http://git-wip-us.apache.org/repos/asf/stratos/blob/39d161e1/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/MemberContextToKubernetesContainer.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/MemberContextToKubernetesContainer.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/MemberContextToKubernetesContainer.java
new file mode 100644
index 0000000..a38f5d6
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/MemberContextToKubernetesContainer.java
@@ -0,0 +1,131 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one 
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
+ * KIND, either express or implied.  See the License for the 
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.stratos.cloud.controller.functions;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.cloud.controller.pojo.Cartridge;
+import org.apache.stratos.cloud.controller.pojo.ClusterContext;
+import org.apache.stratos.cloud.controller.pojo.KubernetesClusterContext;
+import org.apache.stratos.cloud.controller.pojo.PortMapping;
+import org.apache.stratos.cloud.controller.pojo.Property;
+import org.apache.stratos.cloud.controller.runtime.FasterLookUpDataHolder;
+import org.apache.stratos.cloud.controller.util.CloudControllerUtil;
+import org.apache.stratos.common.constants.StratosConstants;
+import org.apache.stratos.kubernetes.client.model.Container;
+import org.apache.stratos.kubernetes.client.model.EnvironmentVariable;
+import org.apache.stratos.kubernetes.client.model.Port;
+
+import com.google.common.base.Function;
+
+/**
+ *	Is responsible for converting a {@link ClusterContext} object to a Kubernetes {@link Container}
+ *	Object.
+ */
+public class ClusterContextToKubernetesContainer implements Function<ClusterContext, Container>{
+	
+	private static final Log log = LogFactory.getLog(ClusterContextToKubernetesContainer.class);
+	private FasterLookUpDataHolder dataHolder = FasterLookUpDataHolder.getInstance();
+
+	@Override
+	public Container apply(ClusterContext clusterContext) {
+		Container container = new Container();
+		container.setName(clusterContext.getHostName());
+
+		Cartridge cartridge = dataHolder.getCartridge(clusterContext
+				.getCartridgeType());
+		
+		if (cartridge == null) {
+			log.error("Cannot find a Cartridge of type : "
+					+ clusterContext.getCartridgeType());
+			return null;
+		}
+		
+		container.setImage(cartridge.getContainer().getImageName());
+
+		container.setPorts(getPorts(clusterContext, cartridge));
+
+		return container;
+	}
+	
+	private Port[] getPorts(ClusterContext ctxt, Cartridge cartridge) {
+		String kubernetesClusterId = CloudControllerUtil.getProperty(ctxt.getProperties(), 
+        		StratosConstants.KUBERNETES_CLUSTER_ID);
+		KubernetesClusterContext kubClusterContext = dataHolder.getKubernetesClusterContext(kubernetesClusterId);
+		Port[] ports = new Port[cartridge.getPortMappings().size()];
+		List<Port> portList = new ArrayList<Port>();
+		
+		for (PortMapping portMapping : cartridge.getPortMappings()) {
+			Port p = new Port();
+			p.setContainerPort(Integer.parseInt(portMapping.getPort()));
+			p.setHostPort(kubClusterContext.getAnAvailableHostPort());
+			p.setProtocol(portMapping.getProtocol());
+			p.setName(p.getProtocol()+p.getContainerPort());
+			portList.add(p);
+		}
+		
+		return portList.toArray(ports);
+	}
+	
+	private String generateMemberId(String clusterId) {
+        UUID memberId = UUID.randomUUID();
+         return clusterId + memberId.toString();
+    }
+	
+	private EnvironmentVariable[] getEnvironmentVars(ClusterContext ctxt, Cartridge cartridge) {
+		
+		String kubernetesClusterId = CloudControllerUtil.getProperty(ctxt.getProperties(), 
+        		StratosConstants.KUBERNETES_CLUSTER_ID);
+		
+		List<EnvironmentVariable> envVars = new ArrayList<EnvironmentVariable>();
+		
+		addToEnvironment(envVars, StratosConstants.MEMBER_ID, generateMemberId(ctxt.getClusterId()));
+		addToEnvironment(envVars, StratosConstants.LB_CLUSTER_ID, generateMemberId(ctxt.getClusterId()));
+		addToEnvironment(envVars, StratosConstants.MEMBER_ID, generateMemberId(ctxt.getClusterId()));
+		addToEnvironment(envVars, StratosConstants.MEMBER_ID, generateMemberId(ctxt.getClusterId()));
+		// have to add memberID to the payload
+        StringBuilder payload = new StringBuilder(ctxt.getPayload());
+        addToPayload(payload, "MEMBER_ID", memberID);
+        addToPayload(payload, "LB_CLUSTER_ID", memberContext.getLbClusterId());
+        addToPayload(payload, "NETWORK_PARTITION_ID", memberContext.getNetworkPartitionId());
+        addToPayload(payload, StratosConstants.KUBERNETES_CLUSTER_ID, kubernetesClusterId);
+        if(memberContext.getProperties() != null) {
+        	org.apache.stratos.cloud.controller.pojo.Properties props1 = memberContext.getProperties();
+            if (props1 != null) {
+                for (Property prop : props1.getProperties()) {
+                    addToPayload(payload, prop.getName(), prop.getValue());
+                }
+            }
+        }
+	}
+
+	private void addToEnvironment(List<EnvironmentVariable> envVars,
+			String name, String value) {
+
+		EnvironmentVariable var = new EnvironmentVariable();
+		var.setName(name);
+		var.setValue(value);
+		envVars.add(var);
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/39d161e1/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/MemberContextToKubernetesService.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/MemberContextToKubernetesService.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/MemberContextToKubernetesService.java
new file mode 100644
index 0000000..79326ce
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/MemberContextToKubernetesService.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one 
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
+ * KIND, either express or implied.  See the License for the 
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.stratos.cloud.controller.functions;
+
+import org.apache.stratos.cloud.controller.pojo.ClusterContext;
+import org.apache.stratos.cloud.controller.pojo.KubernetesClusterContext;
+import org.apache.stratos.cloud.controller.pojo.MemberContext;
+import org.apache.stratos.cloud.controller.runtime.FasterLookUpDataHolder;
+import org.apache.stratos.cloud.controller.util.CloudControllerUtil;
+import org.apache.stratos.common.constants.StratosConstants;
+import org.apache.stratos.kubernetes.client.model.Selector;
+import org.apache.stratos.kubernetes.client.model.Service;
+import com.google.common.base.Function;
+
+/**
+ *	Is responsible for converting a {@link MemberContext} object to a Kubernetes {@link Service}
+ *	Object.
+ */
+public class MemberContextToKubernetesService implements Function<MemberContext, Service>{
+
+	private FasterLookUpDataHolder dataHolder = FasterLookUpDataHolder.getInstance();
+	
+	@Override
+	public Service apply(MemberContext memberContext) {
+		
+		String clusterId = memberContext.getClusterId();
+        ClusterContext clusterContext = dataHolder.getClusterContext(clusterId);
+        
+		String kubernetesClusterId = CloudControllerUtil.getProperty(clusterContext.getProperties(), 
+		StratosConstants.KUBERNETES_CLUSTER_ID);
+		KubernetesClusterContext kubClusterContext = dataHolder.getKubernetesClusterContext(kubernetesClusterId);
+        
+        Service service = new Service();
+        service.setApiVersion("v1beta1");
+        service.setId(clusterId);
+        service.setKind("Service");
+        service.setPort(kubClusterContext.getAnAvailableHostPort());
+        Selector selector = new Selector();
+        selector.setName(clusterId);
+        service.setSelector(selector);
+        
+		return service;
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/39d161e1/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/MemberContextToReplicationController.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/MemberContextToReplicationController.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/MemberContextToReplicationController.java
new file mode 100644
index 0000000..36141f2
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/MemberContextToReplicationController.java
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one 
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
+ * KIND, either express or implied.  See the License for the 
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.stratos.cloud.controller.functions;
+
+import org.apache.stratos.cloud.controller.pojo.ClusterContext;
+import org.apache.stratos.kubernetes.client.model.Container;
+import org.apache.stratos.kubernetes.client.model.Label;
+import org.apache.stratos.kubernetes.client.model.Manifest;
+import org.apache.stratos.kubernetes.client.model.Pod;
+import org.apache.stratos.kubernetes.client.model.ReplicationController;
+import org.apache.stratos.kubernetes.client.model.Selector;
+import org.apache.stratos.kubernetes.client.model.State;
+
+import com.google.common.base.Function;
+
+/**
+ *	Is responsible for converting a {@link ClusterContext} object to a Kubernetes {@link ReplicationController}
+ *	Object.
+ */
+public class ClusterContextToReplicationController implements Function<ClusterContext, ReplicationController>{
+
+	@Override
+	public ReplicationController apply(ClusterContext clusterContext) {
+		ReplicationController contr = new ReplicationController();
+		contr.setId(clusterContext.getClusterId());
+		contr.setKind("ReplicationController");
+		contr.setApiVersion("v1beta1");
+		State desiredState = new State();
+		desiredState.setReplicas(3);
+		Selector selector = new Selector();
+		selector.setName(clusterContext.getClusterId());
+		desiredState.setReplicaSelector(selector);
+
+		Pod podTemplate = new Pod();
+		State podState = new State();
+		Manifest manifest = new Manifest();
+		manifest.setVersion("v1beta1");
+		manifest.setId(clusterContext.getClusterId());
+
+		ClusterContextToKubernetesContainer containerFunc = new ClusterContextToKubernetesContainer();
+		Container container = containerFunc.apply(clusterContext);
+
+		manifest.setContainers(new Container[] { container });
+
+		podState.setManifest(manifest);
+		podTemplate.setDesiredState(podState);
+		Label l1 = new Label();
+		l1.setName(clusterContext.getClusterId());
+		podTemplate.setLabels(l1);
+
+		desiredState.setPodTemplate(podTemplate);
+		contr.setDesiredState(desiredState);
+
+		Label l2 = new Label();
+		l2.setName(clusterContext.getClusterId());
+		contr.setLabels(l2);
+
+		return contr;
+	}
+
+}