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/20 22:56:45 UTC

[7/7] stratos git commit: Introducing KubernetesIaas class, MemberContext.clusterInstanceId, removing Cartridge.deployerType

Introducing KubernetesIaas class, MemberContext.clusterInstanceId, removing Cartridge.deployerType


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

Branch: refs/heads/master
Commit: b575c7d68669527c6f130bf1d1cb34fbdb9913b2
Parents: 4e6bebe
Author: Imesh Gunaratne <im...@apache.org>
Authored: Sun Dec 21 03:20:36 2014 +0530
Committer: Imesh Gunaratne <im...@apache.org>
Committed: Sun Dec 21 03:25:27 2014 +0530

----------------------------------------------------------------------
 .../applications/topic/ApplicationBuilder.java  |  11 +-
 .../client/CloudControllerClient.java           | 183 +----
 .../context/cluster/ClusterContext.java         |   3 +-
 .../autoscaler/monitor/MonitorFactory.java      |   2 +-
 .../monitor/cluster/ClusterMonitor.java         |  14 +-
 .../component/ParentComponentMonitor.java       |  12 +-
 .../autoscaler/rule/RuleTasksDelegator.java     | 149 +---
 .../cluster/ClusterStatusProcessorChain.java    |   3 -
 .../config/CartridgeAgentConfiguration.java     |  24 +-
 .../publisher/CartridgeAgentEventPublisher.java |  24 +-
 .../context/CloudControllerContext.java         |   4 +-
 .../cloud/controller/domain/Cartridge.java      |  13 +-
 .../controller/domain/InstanceContext.java      | 100 +++
 .../controller/domain/InstanceMetadata.java     | 107 +++
 .../cloud/controller/domain/MemberContext.java  |  87 ++-
 .../exception/CartridgeNotFoundException.java   |  44 ++
 .../UnregisteredCartridgeException.java         |  44 --
 ...inerClusterContextToKubernetesContainer.java |  13 +-
 ...tainerClusterContextToKubernetesService.java |   5 +-
 ...erClusterContextToReplicationController.java |  19 +-
 .../stratos/cloud/controller/iaases/Iaas.java   |  20 +-
 .../cloud/controller/iaases/JcloudsIaas.java    |  75 +-
 .../cloud/controller/iaases/KubernetesIaas.java | 651 ++++++++++++++++
 .../cloud/controller/iaases/MockIaas.java       |  11 +-
 .../controller/iaases/mock/MockIaasService.java |  27 +-
 .../iaases/mock/MockMemberContext.java          |  22 +-
 .../iaases/mock/MockMemberEventPublisher.java   |  28 +-
 .../iaases/mock/MockNodeMetadata.java           | 143 ----
 .../iaases/mock/MockPartitionValidator.java     |   3 +-
 .../validators/AWSEC2PartitionValidator.java    |   2 +-
 .../CloudstackPartitionValidator.java           |   5 +-
 .../validators/DockerPartitionValidator.java    |   5 +-
 .../validators/GCEPartitionValidator.java       |  10 +-
 .../validators/IaasBasedPartitionValidator.java |  47 --
 .../KubernetesBasedPartitionValidator.java      |  67 --
 .../KubernetesPartitionValidator.java           |  72 ++
 .../OpenstackNovaPartitionValidator.java        |   3 +-
 .../iaases/validators/PartitionValidator.java   |  18 +-
 .../validators/VCloudPartitionValidator.java    |   2 +-
 .../publisher/StatisticsDataPublisher.java      |  18 +-
 .../publisher/TopologyEventPublisher.java       | 323 ++++++++
 .../publisher/TopologySynchronizerTask.java     |  69 ++
 .../TopologySynchronizerTaskScheduler.java      |   2 -
 .../messaging/topology/TopologyBuilder.java     |  84 +-
 .../topology/TopologyEventPublisher.java        | 321 --------
 .../topology/TopologySynchronizerTask.java      |  68 --
 .../services/CloudControllerService.java        |  79 +-
 .../impl/CloudControllerServiceImpl.java        | 774 +++----------------
 .../impl/CloudControllerServiceUtil.java        |   8 +-
 .../services/impl/InstanceCreator.java          |  58 +-
 .../controller/util/CloudControllerUtil.java    |   1 -
 .../controller/util/PodActivationWatcher.java   |  41 +-
 .../definition/CartridgeDefinitionBean.java     |  10 -
 .../stratos/common/beans/topology/Member.java   |  43 +-
 .../kubernetes/client/KubernetesApiClient.java  |  17 +-
 .../KubernetesAPIClientInterface.java           |   2 +-
 .../live/KubernetesApiClientLiveTest.java       |  12 +-
 .../conf/LoadBalancerConfiguration.java         |   3 +-
 .../client/CloudControllerServiceClient.java    |   4 +-
 .../cartridge/CartridgeDeploymentManager.java   |  13 +-
 .../service/ServiceDeploymentManager.java       |   4 +-
 .../deployer/DefaultServiceGroupDeployer.java   |   4 +-
 .../grouping/deployer/ServiceGroupDeployer.java |   4 +-
 .../manager/ServiceGroupingManager.java         |   4 +-
 .../manager/CartridgeSubscriptionManager.java   |   6 +-
 .../utils/ApplicationManagementUtil.java        |   4 +-
 .../messaging/domain/topology/Member.java       |  41 +-
 .../instance/status/InstanceActivatedEvent.java |  18 +-
 .../status/InstanceMaintenanceModeEvent.java    |  18 +-
 .../status/InstanceReadyToShutdownEvent.java    |  19 +-
 .../instance/status/InstanceStartedEvent.java   |  17 +-
 .../instance/status/InstanceStatusEvent.java    |   2 +
 .../event/topology/InstanceSpawnedEvent.java    |  18 +-
 .../event/topology/MemberActivatedEvent.java    |  19 +-
 .../topology/MemberMaintenanceModeEvent.java    |  23 +-
 .../topology/MemberReadyToShutdownEvent.java    |  20 +-
 .../event/topology/MemberStartedEvent.java      |  15 +-
 .../event/topology/MemberTerminatedEvent.java   |  22 +-
 .../InstanceSpawnedMessageProcessor.java        |  13 +-
 .../cartridgeagent/cartridgeagent/agent.py      |  10 +-
 .../config/cartridgeagentconfiguration.py       |  22 +-
 .../modules/event/instance/status/events.py     |  47 +-
 .../modules/event/topology/events.py            |  60 +-
 .../publisher/cartridgeagentpublisher.py        |  47 +-
 .../modules/util/cartridgeagentconstants.py     |   3 +-
 .../rest/endpoint/api/StratosApiV41Utils.java   |   4 +-
 .../util/converter/ObjectConverter.java         | 371 ++++-----
 .../src/main/resources/AutoScalerService.wsdl   |  20 +-
 .../main/resources/CloudControllerService.wsdl  | 516 ++++---------
 89 files changed, 2588 insertions(+), 2805 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/b575c7d6/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java
index a07f5c6..7968acb 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java
@@ -477,7 +477,6 @@ public class ApplicationBuilder {
                                                                 String parentId,
                                                                 String networkPartitionId,
                                                                 String partitionId) {
-        GroupInstance groupInstance = null;
         ApplicationHolder.acquireWriteLock();
         try {
             if (log.isDebugEnabled()) {
@@ -490,14 +489,14 @@ public class ApplicationBuilder {
             if (application == null) {
                 log.warn(String.format("Application %s does not exist",
                         appId));
-                return groupInstance;
+                return null;
             }
 
             Group group = application.getGroupRecursively(groupId);
             if (group == null) {
                 log.warn(String.format("Group %s does not exist when creating group",
                         groupId));
-                return groupInstance;
+                return null;
             }
 
             GroupStatus status = GroupStatus.Created;
@@ -514,6 +513,7 @@ public class ApplicationBuilder {
 
             if (!group.containsInstanceContext(instanceId)) {
                 //setting the status, persist and publish
+                GroupInstance groupInstance = null;
                 groupInstance = new GroupInstance(groupId, instanceId);
                 groupInstance.setParentId(parentId);
                 groupInstance.setPartitionId(partitionId);
@@ -523,6 +523,7 @@ public class ApplicationBuilder {
                 //updateGroupMonitor(appId, groupId, status);
                 ApplicationHolder.persistApplication(application);
                 ApplicationsEventPublisher.sendGroupInstanceCreatedEvent(appId, groupId, groupInstance);
+                return groupInstance;
             } else {
                 log.warn("Group Instance Context already exists: [group-id] " + groupId +
                         " [Group-Instance-Id] " + instanceId);
@@ -530,9 +531,7 @@ public class ApplicationBuilder {
         } finally {
             ApplicationHolder.releaseWriteLock();
         }
-
-
-        return groupInstance;
+        return null;
     }
 
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/b575c7d6/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/client/CloudControllerClient.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/client/CloudControllerClient.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/client/CloudControllerClient.java
index 210f5e1..430dd97 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/client/CloudControllerClient.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/client/CloudControllerClient.java
@@ -28,25 +28,20 @@ import org.apache.stratos.autoscaler.applications.pojo.ApplicationClusterContext
 import org.apache.stratos.autoscaler.exception.cartridge.CartridgeInformationException;
 import org.apache.stratos.autoscaler.exception.cartridge.SpawningException;
 import org.apache.stratos.autoscaler.exception.cartridge.TerminationException;
-import org.apache.stratos.autoscaler.exception.kubernetes.NonExistingKubernetesGroupException;
 import org.apache.stratos.autoscaler.exception.partition.PartitionValidationException;
-import org.apache.stratos.autoscaler.pojo.policy.deployment.DeploymentPolicy;
-import org.apache.stratos.autoscaler.kubernetes.KubernetesManager;
-import org.apache.stratos.autoscaler.pojo.policy.deployment.partition.network.*;
 import org.apache.stratos.autoscaler.util.AutoscalerUtil;
 import org.apache.stratos.autoscaler.util.ConfUtil;
 import org.apache.stratos.cloud.controller.stub.*;
-import org.apache.stratos.cloud.controller.stub.domain.*;
+import org.apache.stratos.cloud.controller.stub.domain.CartridgeInfo;
+import org.apache.stratos.cloud.controller.stub.domain.InstanceContext;
+import org.apache.stratos.cloud.controller.stub.domain.MemberContext;
 import org.apache.stratos.cloud.controller.stub.domain.Partition;
 import org.apache.stratos.common.Properties;
 import org.apache.stratos.common.Property;
 import org.apache.stratos.common.constants.StratosConstants;
-import org.apache.stratos.common.kubernetes.KubernetesGroup;
-import org.apache.stratos.common.kubernetes.KubernetesMaster;
 
 import java.rmi.RemoteException;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 import java.util.Set;
 
@@ -137,9 +132,6 @@ public class CloudControllerClient {
         return partition1;
     }
 
-
-
-
     /*
      * Calls the CC to validate the partition.
      */
@@ -166,10 +158,10 @@ public class CloudControllerClient {
 
     }
 
-    public synchronized MemberContext spawnAnInstance(Partition partition,
-                                                      String clusterId,
-                                                      String networkPartitionId,String instanceID, boolean isPrimary,
-                                                      int minMemberCount) throws SpawningException {
+    public synchronized MemberContext startInstance(Partition partition,
+                                                    String clusterId, String clusterInstanceId,
+                                                    String networkPartitionId, boolean isPrimary,
+                                                    int minMemberCount) throws SpawningException {
         try {
             if (log.isInfoEnabled()) {
                 log.info(String.format("Trying to spawn an instance via cloud controller: " +
@@ -183,14 +175,14 @@ public class CloudControllerClient {
                 log.debug("Member Obsolete Expiry Time is set to: " + expiryTime);
             }
 
-            MemberContext member = new MemberContext();
-            member.setClusterId(clusterId);
-            member.setPartition(partition);
-	        member.setInstanceId(instanceID);
-//            member.setLbClusterId(lbClusterId);
-            member.setObsoleteExpiryTime(expiryTime);
-            member.setInitTime(System.currentTimeMillis());
-            member.setNetworkPartitionId(networkPartitionId);
+            InstanceContext instanceContext = new InstanceContext();
+            instanceContext.setClusterId(clusterId);
+            instanceContext.setClusterInstanceId(clusterInstanceId);
+            instanceContext.setPartition(partition);
+            instanceContext.setInitTime(System.currentTimeMillis());
+            instanceContext.setObsoleteExpiryTime(expiryTime);
+            instanceContext.setNetworkPartitionId(networkPartitionId);
+
             Properties memberContextProps = new Properties();
             Property isPrimaryProp = new Property();
             isPrimaryProp.setName("PRIMARY");
@@ -202,18 +194,17 @@ public class CloudControllerClient {
 
             memberContextProps.addProperty(isPrimaryProp);
             memberContextProps.addProperty(minCountProp);
-            member.setProperties(AutoscalerUtil.toStubProperties(memberContextProps));
-
+            instanceContext.setProperties(AutoscalerUtil.toStubProperties(memberContextProps));
 
             long startTime = System.currentTimeMillis();
-            MemberContext memberContext = stub.startInstance(member);
+            MemberContext memberContext = stub.startInstance(instanceContext);
             if (log.isDebugEnabled()) {
                 long endTime = System.currentTimeMillis();
                 log.debug(String.format("Service call startInstance() returned in %dms", (endTime - startTime)));
             }
             return memberContext;
-        } catch (CloudControllerServiceUnregisteredCartridgeExceptionException e) {
-            String message = e.getFaultMessage().getUnregisteredCartridgeException().getMessage();
+        } catch (CloudControllerServiceCartridgeNotFoundExceptionException e) {
+            String message = e.getFaultMessage().getCartridgeNotFoundException().getMessage();
             log.error(message, e);
             throw new SpawningException(message, e);
         } catch (RemoteException e) {
@@ -337,144 +328,10 @@ public class CloudControllerClient {
             String msg = e.getMessage();
             log.error(msg, e);
             throw new CartridgeInformationException(msg, e);
-        } catch (CloudControllerServiceUnregisteredCartridgeExceptionException e) {
+        } catch (CloudControllerServiceCartridgeNotFoundExceptionException e) {
             String msg = e.getMessage();
             log.error(msg, e);
             throw new CartridgeInformationException(msg, e);
         }
     }
-
-    /**
-     * @param kubernetesClusterId
-     * 				kubernetes cluster id in which the cluster needs be created
-     * @param clusterId
-     * 				service cluster id
-     * @return the {@link MemberContext}
-     * @throws SpawningException
-     * 				if client can't connect to cloud controller service, if
-     * 				cartridge not found for the given cluster id, or if the given
-     * 				kubernetes cluster id is not valid
-     */
-    public synchronized MemberContext[] startContainers(Partition partition,
-            String clusterId,
-            String networkPartitionId,String instanceID, boolean isPrimary,
-            int minMemberCount) throws SpawningException {
-        try {
-
-//            KubernetesManager kubernetesManager = KubernetesManager.getInstance();
-//            KubernetesMaster kubernetesMaster = kubernetesManager.getKubernetesMasterInGroup(kubernetesClusterId);
-//            String kubernetesMasterIP = kubernetesMaster.getHostIpAddress();
-//            KubernetesGroup kubernetesGroup = kubernetesManager.getKubernetesGroup(kubernetesClusterId);
-//            int lower = kubernetesGroup.getPortRange().getLower();
-//            int upper = kubernetesGroup.getPortRange().getUpper();
-//            String portRange = Integer.toString(lower) + "-" + Integer.toString(upper);
-
-            ContainerClusterContext context = new ContainerClusterContext();
-            context.setClusterId(clusterId);
-            context.setPartition(partition);
-            context.setNetworkPartitionId(networkPartitionId);
-            context.setInstanceId(instanceID);
-            
-            Properties memberContextProps = new Properties();
-            Property isPrimaryProp = new Property();
-            isPrimaryProp.setName("PRIMARY");
-            isPrimaryProp.setValue(String.valueOf(isPrimary));
-
-            Property minCountProp = new Property();
-            minCountProp.setName(StratosConstants.MIN_COUNT);
-            minCountProp.setValue(String.valueOf(minMemberCount));
-
-            memberContextProps.addProperty(isPrimaryProp);
-            memberContextProps.addProperty(minCountProp);
-            context.setProperties(AutoscalerUtil.toStubProperties(memberContextProps));
-            
-//            Properties memberContextProps = new Properties();
-//            Property kubernetesClusterMasterIPProps = new Property();
-//            kubernetesClusterMasterIPProps.setName(StratosConstants.KUBERNETES_MASTER_IP);
-//            kubernetesClusterMasterIPProps.setValue(kubernetesMasterIP);
-//            memberContextProps.addProperty(kubernetesClusterMasterIPProps);
-//            Property kubernetesClusterPortRangeProps = new Property();
-//            kubernetesClusterPortRangeProps.setName(StratosConstants.KUBERNETES_PORT_RANGE);
-//            kubernetesClusterPortRangeProps.setValue(portRange);
-//            memberContextProps.addProperty(kubernetesClusterPortRangeProps);
-//            context.setProperties(AutoscalerUtil.toStubProperties(memberContextProps));
-            long startTime = System.currentTimeMillis();
-            MemberContext[] memberContexts = stub.startContainers(context);
-
-            if (log.isDebugEnabled()) {
-                long endTime = System.currentTimeMillis();
-                log.debug(String.format("Service call startContainer() returned in %dms", (endTime - startTime)));
-            }
-            return memberContexts;
-        } catch (CloudControllerServiceUnregisteredCartridgeExceptionException e) {
-            String msg = String.format("Error while creating containers. Cartridge not found for cluster [%s] ", clusterId);
-            log.error(msg, e);
-            throw new SpawningException(msg, e);
-        } catch (RemoteException e) {
-        	String msg = "Error while creating containers, couldn't communicate with cloud controller service";
-        	log.error(msg, e);
-        	throw new SpawningException(msg, e);
-        } 
-//        catch (NonExistingKubernetesGroupException e) {
-//        	String msg = String.format("Error while creating containers, invalid kubernetes group [%s] ", kubernetesClusterId);
-//        	log.error(msg, e);
-//        	throw new SpawningException(msg, e);
-//        }
-    }
-
-    public synchronized void terminateContainers(String clusterId) throws TerminationException {
-        try {
-            if (log.isInfoEnabled()) {
-                log.info(String.format("Terminating containers via cloud controller: [cluster] %s", clusterId));
-            }
-            long startTime = System.currentTimeMillis();
-            stub.terminateContainers(clusterId);
-            if (log.isDebugEnabled()) {
-                long endTime = System.currentTimeMillis();
-                log.debug(String.format("Service call terminateContainer() returned in %dms", (endTime - startTime)));
-            }
-        } catch (RemoteException e) {
-        	String msg = "Error while creating containers, couldn't communicate with cloud controller service";
-            log.error(msg, e);
-            throw new TerminationException(msg, e);
-        } catch (CloudControllerServiceInvalidClusterExceptionException e) {
-        	String msg = "Invalid Cluster [clusterId] " + clusterId;
-            log.error(msg, e);
-            throw new TerminationException(msg, e);
-        }
-    }
-
-    public synchronized MemberContext[] updateContainers(String clusterId, int replicas)
-            throws SpawningException {
-        try {
-            log.info(String.format("Updating kubernetes replication controller via cloud controller: " +
-                    "[cluster] %s [replicas] %s", clusterId, replicas));
-            MemberContext[] memberContexts = stub.updateContainers(clusterId, replicas);
-            return memberContexts;
-        } catch (CloudControllerServiceUnregisteredCartridgeExceptionException e) {
-            String msg = "Error while updating kubernetes controller, cartridge not found for [cluster] " + clusterId;
-            log.error(msg, e);
-            throw new SpawningException(msg, e);
-        } catch (RemoteException e) {
-            String msg = "Error while updating kubernetes controller, cannot communicate with " +
-                    "cloud controller service";
-            log.error(msg, e);
-            throw new SpawningException(msg, e);
-        }
-    }
-
-    public synchronized void terminateContainer(String memberId) throws TerminationException {
-        try {
-            stub.terminateContainer(memberId);
-        } catch (RemoteException e) {
-            String msg = "Error while updating kubernetes controller, cannot communicate with " +
-                    "cloud controller service";
-            log.error(msg, e);
-            throw new TerminationException(msg, e);
-        } catch (CloudControllerServiceMemberTerminationFailedExceptionException e) {
-            String msg = "Error while terminating container, member not valid for member id : " + memberId;
-            log.error(msg, e);
-            throw new TerminationException(msg, e);
-        }
-    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/b575c7d6/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/ClusterContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/ClusterContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/ClusterContext.java
index b680fd1..ef7068a 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/ClusterContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/ClusterContext.java
@@ -127,8 +127,7 @@ public class ClusterContext extends AbstractClusterContext {
         ClusterLevelNetworkPartitionContext networkPartitionContext = null;
         ClusterInstance clusterInstance = cluster.getInstanceContexts(instanceId);
         ChildPolicy policy = this.deploymentPolicy.
-                getChildPolicy(
-                        AutoscalerUtil.getAliasFromClusterId(clusterId));
+                getChildPolicy(AutoscalerUtil.getAliasFromClusterId(clusterId));
         if (networkPartitionCtxts.containsKey(clusterInstance.getNetworkPartitionId())) {
             networkPartitionContext = this.networkPartitionCtxts.get(
                     clusterInstance.getNetworkPartitionId());

http://git-wip-us.apache.org/repos/asf/stratos/blob/b575c7d6/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/MonitorFactory.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/MonitorFactory.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/MonitorFactory.java
index b5b1614..7ad7bed 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/MonitorFactory.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/MonitorFactory.java
@@ -270,7 +270,7 @@ public class MonitorFactory {
             }
 
             //Creating the instance of the cluster
-            ((ClusterMonitor) clusterMonitor).createClusterInstance(parentInstanceIds, cluster);
+            ((ClusterMonitor) clusterMonitor).createClusterInstances(parentInstanceIds, cluster);
             //add it to autoscaler context
             AutoscalerContext.getInstance().addClusterMonitor(clusterMonitor);
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/b575c7d6/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/ClusterMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/ClusterMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/ClusterMonitor.java
index 24b8f3a..d99fd55 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/ClusterMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/ClusterMonitor.java
@@ -859,14 +859,15 @@ public class ClusterMonitor extends AbstractClusterMonitor {
     public void handleMemberActivatedEvent(
             MemberActivatedEvent memberActivatedEvent) {
 
-        String instanceId = memberActivatedEvent.getInstanceId();
         String clusterId = memberActivatedEvent.getClusterId();
+        String clusterInstanceId = memberActivatedEvent.getClusterInstanceId();
+        String memberId = memberActivatedEvent.getMemberId();
         String networkPartitionId = memberActivatedEvent.getNetworkPartitionId();
         String partitionId = memberActivatedEvent.getPartitionId();
-        String memberId = memberActivatedEvent.getMemberId();
-        ClusterInstanceContext networkPartitionCtxt = getClusterInstanceContext(networkPartitionId, instanceId);
+
+        ClusterInstanceContext clusterInstanceContext = getClusterInstanceContext(networkPartitionId, clusterInstanceId);
         ClusterLevelPartitionContext clusterLevelPartitionContext;
-        clusterLevelPartitionContext = networkPartitionCtxt.getPartitionCtxt(partitionId);
+        clusterLevelPartitionContext = clusterInstanceContext.getPartitionCtxt(partitionId);
         clusterLevelPartitionContext.addMemberStatsContext(new MemberStatsContext(memberId));
         if (log.isDebugEnabled()) {
             log.debug(String.format("Member stat context has been added successfully: "
@@ -874,7 +875,7 @@ public class ClusterMonitor extends AbstractClusterMonitor {
         }
         clusterLevelPartitionContext.movePendingMemberToActiveMembers(memberId);
         ServiceReferenceHolder.getInstance().getClusterStatusProcessorChain().process(
-                ClusterStatusActiveProcessor.class.getName(), clusterId, instanceId);
+                ClusterStatusActiveProcessor.class.getName(), clusterId, clusterInstanceId);
     }
 
     @Override
@@ -1117,12 +1118,11 @@ public class ClusterMonitor extends AbstractClusterMonitor {
         return ((ClusterContext) this.clusterContext).getNetworkPartitionCtxts().values();
     }
 
-    public void createClusterInstance(List<String> parentInstanceIds, Cluster cluster)
+    public void createClusterInstances(List<String> parentInstanceIds, Cluster cluster)
             throws PolicyValidationException, PartitionValidationException {
         for (String parentInstanceId : parentInstanceIds) {
             createInstance(parentInstanceId, cluster);
         }
-
     }
 
     public boolean createInstanceOnDemand(String instanceId) {

http://git-wip-us.apache.org/repos/asf/stratos/blob/b575c7d6/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ParentComponentMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ParentComponentMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ParentComponentMonitor.java
index 8d40397..f4b164a 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ParentComponentMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ParentComponentMonitor.java
@@ -684,11 +684,11 @@ public abstract class ParentComponentMonitor extends Monitor implements Runnable
 
 
     protected synchronized void startMonitor(ParentComponentMonitor parent,
-                                             ApplicationChildContext context, List<String> instanceId) {
+                                             ApplicationChildContext context, List<String> instanceIds) {
 
         if (!this.aliasToActiveMonitorsMap.containsKey(context.getId())) {
             pendingMonitorsList.add(context.getId());
-            executorService.submit(new MonitorAdder(parent, context, this.appId, instanceId));
+            executorService.submit(new MonitorAdder(parent, context, this.appId, instanceIds));
             if (log.isDebugEnabled()) {
                 log.debug(String.format("Monitor Adder has been added: [cluster] %s ", context.getId()));
             }
@@ -775,14 +775,14 @@ public abstract class ParentComponentMonitor extends Monitor implements Runnable
         private ApplicationChildContext context;
         private ParentComponentMonitor parent;
         private String appId;
-        private List<String> instanceId;
+        private List<String> instanceIds;
 
         public MonitorAdder(ParentComponentMonitor parent, ApplicationChildContext context,
-                            String appId, List<String> instanceId) {
+                            String appId, List<String> instanceIds) {
             this.parent = parent;
             this.context = context;
             this.appId = appId;
-            this.instanceId = instanceId;
+            this.instanceIds = instanceIds;
         }
 
         public void run() {
@@ -801,7 +801,7 @@ public abstract class ParentComponentMonitor extends Monitor implements Runnable
                             + context.getId());
                 }
                 try {
-                    monitor = MonitorFactory.getMonitor(parent, context, appId, instanceId);
+                    monitor = MonitorFactory.getMonitor(parent, context, appId, instanceIds);
                 } catch (DependencyBuilderException e) {
                     String msg = "Monitor creation failed for: " + context.getId();
                     log.warn(msg, e);

http://git-wip-us.apache.org/repos/asf/stratos/blob/b575c7d6/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java
index d4328ab..9ef332c 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java
@@ -35,7 +35,6 @@ import org.apache.stratos.autoscaler.context.member.MemberStatsContext;
 import org.apache.stratos.autoscaler.context.partition.ClusterLevelPartitionContext;
 import org.apache.stratos.autoscaler.context.partition.network.ClusterLevelNetworkPartitionContext;
 import org.apache.stratos.autoscaler.event.publisher.InstanceNotificationPublisher;
-import org.apache.stratos.autoscaler.exception.cartridge.TerminationException;
 import org.apache.stratos.autoscaler.monitor.cluster.AbstractClusterMonitor;
 import org.apache.stratos.autoscaler.monitor.cluster.ClusterMonitor;
 import org.apache.stratos.cloud.controller.stub.domain.MemberContext;
@@ -137,7 +136,6 @@ public class RuleTasksDelegator {
         //FIXME to not parse for algo when partition is chosen by the parent
 
         if(partitionAlgorithm == null) {
-
             //Send one after another as default
             partitionAlgorithm = Constants.ONE_AFTER_ANOTHER_ALGORITHM_ID;
         }
@@ -145,10 +143,8 @@ public class RuleTasksDelegator {
             log.debug(String.format("Retrieving partition algorithm [Partition algorithm]: ", partitionAlgorithm));
         }
         if (Constants.ROUND_ROBIN_ALGORITHM_ID.equals(partitionAlgorithm)) {
-
             autoscaleAlgorithm = new RoundRobin();
         } else if (Constants.ONE_AFTER_ANOTHER_ALGORITHM_ID.equals(partitionAlgorithm)) {
-
             autoscaleAlgorithm = new OneAfterAnother();
         } else {
             if (log.isErrorEnabled()) {
@@ -159,9 +155,7 @@ public class RuleTasksDelegator {
     }
 
     public void delegateInstanceCleanup(String memberId) {
-
         try {
-
             // send the instance notification event.
             InstanceNotificationPublisher.getInstance().sendInstanceCleanupEventForMember(memberId);
             log.info("Instance clean up event sent for [member] " + memberId);
@@ -171,131 +165,51 @@ public class RuleTasksDelegator {
         }
     }
 
-    public void delegateStartContainers(ClusterLevelPartitionContext clusterMonitorPartitionContext, String clusterId, String instanceId, boolean isPrimary) {
+    /**
+     * Invoked from drools to start an instance.
+     * @param clusterMonitorPartitionContext Cluster monitor partition context
+     * @param clusterId Cluster id
+     * @param clusterInstanceId Instance id
+     * @param isPrimary Is a primary member
+     */
+    public void delegateSpawn(ClusterLevelPartitionContext clusterMonitorPartitionContext, String clusterId,
+                              String clusterInstanceId, boolean isPrimary) {
 
         try {
-
             String nwPartitionId = clusterMonitorPartitionContext.getNetworkPartitionId();
-//            NetworkPartitionLbHolder lbHolder =
-//                    PartitionManager.getInstance()
-//                            .getNetworkPartitionLbHolder(nwPartitionId);
-//            String lbClusterId = getLbClusterId(lbRefType, clusterMonitorPartitionContext, lbHolder);
-            //Calculate accumulation of minimum counts of all the partition of current network partition
+
+            // Calculate accumulation of minimum counts of all the partition of current network partition
             int minimumCountOfNetworkPartition = 0;
-            ClusterMonitor vmClusterMonitor = (ClusterMonitor) AutoscalerContext.getInstance().getClusterMonitor(clusterId);
-            ClusterContext clusterContext = (ClusterContext) vmClusterMonitor.getClusterContext();
-            ClusterLevelNetworkPartitionContext  clusterLevelNetworkPartitionContext = clusterContext.getNetworkPartitionCtxt(nwPartitionId);
+            ClusterMonitor clusterMonitor = (ClusterMonitor) AutoscalerContext.getInstance().getClusterMonitor(clusterId);
+            ClusterContext clusterContext = (ClusterContext) clusterMonitor.getClusterContext();
+            ClusterLevelNetworkPartitionContext clusterLevelNetworkPartitionContext = clusterContext.getNetworkPartitionCtxt(nwPartitionId);
             ClusterInstanceContext clusterInstanceContext =
                     (ClusterInstanceContext) clusterLevelNetworkPartitionContext.
-                                getInstanceContext(instanceId);
+                            getInstanceContext(clusterInstanceId);
             minimumCountOfNetworkPartition = clusterInstanceContext.getMinInstanceCount();
-            
-            
-            MemberContext[] memberContexts =
+
+            MemberContext memberContext =
                     CloudControllerClient.getInstance()
-                            .startContainers(clusterMonitorPartitionContext.getPartition(),
+                            .startInstance(clusterMonitorPartitionContext.getPartition(),
                                     clusterId,
-                                    instanceId,
-                                    clusterMonitorPartitionContext.getNetworkPartitionId(),
+                                    clusterInstanceId, clusterMonitorPartitionContext.getNetworkPartitionId(),
                                     isPrimary,
                                     minimumCountOfNetworkPartition);
-            if (null != memberContexts) {
-                for (MemberContext memberContext : memberContexts) {
-                    if (null != memberContext) {
-                        clusterMonitorPartitionContext.addPendingMember(memberContext);
-                        if (log.isDebugEnabled()) {
-                            log.debug(String.format("Pending member added, [member] %s [partition] %s", memberContext.getMemberId(),
-                                    memberContext.getPartition().getId()));
-                        }
-                    } else {
-                        if (log.isDebugEnabled()) {
-                            log.debug("Returned member context is null, did not add any pending members");
-                        }
-                    }
-                }
-            } else {
+            if (memberContext != null) {
+                clusterMonitorPartitionContext.addPendingMember(memberContext);
                 if (log.isDebugEnabled()) {
-                    log.debug("Returned member context is null, did not add to pending members");
+                    log.debug(String.format("Pending member added, [member] %s [partition] %s", memberContext.getMemberId(),
+                            memberContext.getPartition().getId()));
                 }
-            }
 
-        } catch (Throwable e) {
-            String message = "Cannot spawn an instance";
-            log.error(message, e);
-            throw new RuntimeException(message, e);
-        }
-    }
-    
-    public void delegateSpawn(ClusterLevelPartitionContext clusterMonitorPartitionContext, String clusterId, String instanceId, boolean isPrimary) {
-
-        try {
-
-            String nwPartitionId = clusterMonitorPartitionContext.getNetworkPartitionId();
-//            NetworkPartitionLbHolder lbHolder =
-//                    PartitionManager.getInstance()
-//                            .getNetworkPartitionLbHolder(nwPartitionId);
-//            String lbClusterId = getLbClusterId(lbRefType, clusterMonitorPartitionContext, lbHolder);
-            //Calculate accumulation of minimum counts of all the partition of current network partition
-            int minimumCountOfNetworkPartition = 0;
-            ClusterMonitor vmClusterMonitor = (ClusterMonitor) AutoscalerContext.getInstance().getClusterMonitor(clusterId);
-            ClusterContext clusterContext = (ClusterContext) vmClusterMonitor.getClusterContext();
-            ClusterLevelNetworkPartitionContext  clusterLevelNetworkPartitionContext = clusterContext.getNetworkPartitionCtxt(nwPartitionId);
-            ClusterInstanceContext clusterInstanceContext =
-                    (ClusterInstanceContext) clusterLevelNetworkPartitionContext.
-                            getInstanceContext(instanceId);
-            minimumCountOfNetworkPartition = clusterInstanceContext.getMinInstanceCount();
-            
-            if (vmClusterMonitor.getCluster().isKubernetesCluster()) {
-                MemberContext[] memberContexts =
-                        CloudControllerClient.getInstance()
-                                .startContainers(clusterMonitorPartitionContext.getPartition(),
-                                        clusterId,
-                                        instanceId,
-                                        clusterMonitorPartitionContext.getNetworkPartitionId(),
-                                        isPrimary,
-                                        minimumCountOfNetworkPartition);
-                if (null != memberContexts) {
-                    for (MemberContext memberContext : memberContexts) {
-                        if (null != memberContext) {
-                            clusterMonitorPartitionContext.addPendingMember(memberContext);
-                            if (log.isDebugEnabled()) {
-                                log.debug(String.format("Pending member added, [member] %s [partition] %s", memberContext.getMemberId(),
-                                        memberContext.getPartition().getId()));
-                            }
-                        } else {
-                            if (log.isDebugEnabled()) {
-                                log.debug("Returned member context is null, did not add any pending members");
-                            }
-                        }
-                    }
-                } else {
-                    if (log.isDebugEnabled()) {
-                        log.debug("Returned member context is null, did not add to pending members");
-                    }
-                }
             } else {
-                
-                MemberContext memberContext =
-                        CloudControllerClient.getInstance()
-                                .spawnAnInstance(clusterMonitorPartitionContext.getPartition(),
-                                        clusterId,
-                                        clusterMonitorPartitionContext.getNetworkPartitionId(),
-                                        instanceId,
-                                        isPrimary,
-                                        minimumCountOfNetworkPartition);
-                if (memberContext != null) {
-                    clusterMonitorPartitionContext.addPendingMember(memberContext);
-                    if (log.isDebugEnabled()) {
-                        log.debug(String.format("Pending member added, [member] %s [partition] %s", memberContext.getMemberId(),
-                                memberContext.getPartition().getId()));
-                    }
-
-                } else if (log.isDebugEnabled()) {
-                    log.debug("Returned member context is null, did not add to pending members");
+                if (log.isErrorEnabled()) {
+                    log.error("Member context returned from cloud controller is null");
                 }
             }
         } catch (Throwable e) {
-            String message = "Cannot spawn an instance";
+            String message = String.format("Could not start instance: [cluster-id] %s [instance-id] %s",
+                    clusterId, clusterInstanceId);
             log.error(message, e);
             throw new RuntimeException(message, e);
         }
@@ -384,15 +298,6 @@ public class RuleTasksDelegator {
         }
     }
 
-    public void delegateTerminateContainer(String memberId) {
-        try {
-            CloudControllerClient ccClient = CloudControllerClient.getInstance();
-            ccClient.terminateContainer(memberId);
-        } catch (TerminationException e) {
-            log.error("Cannot delete container ", e);
-        }
-    }
-
     public int getPredictedReplicasForStat(int minReplicas, float statUpperLimit, float statPredictedValue) {
         if (statUpperLimit == 0) {
             return 0;

http://git-wip-us.apache.org/repos/asf/stratos/blob/b575c7d6/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusProcessorChain.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusProcessorChain.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusProcessorChain.java
index 44ddbde..16dc0aa 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusProcessorChain.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusProcessorChain.java
@@ -47,8 +47,5 @@ public class ClusterStatusProcessorChain extends StatusProcessorChain {
             throw new RuntimeException("Message processor chain is not initialized");
         }
         return root.process(type, clusterId, instanceId);
-
     }
-
-
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/b575c7d6/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/config/CartridgeAgentConfiguration.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/config/CartridgeAgentConfiguration.java b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/config/CartridgeAgentConfiguration.java
index febbcd3..1326509 100644
--- a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/config/CartridgeAgentConfiguration.java
+++ b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/config/CartridgeAgentConfiguration.java
@@ -71,7 +71,9 @@ public class CartridgeAgentConfiguration {
     private String superTenantRepositoryPath;
     private String tenantRepositoryPath;
     private String kubernetesClusterId;
-        
+    private String instanceId;
+    private String clusterInstanceId;
+
 
     private CartridgeAgentConfiguration() {
         parameters = loadParametersFile();
@@ -582,6 +584,22 @@ public class CartridgeAgentConfiguration {
 	public String getKubernetesClusterId() {
 		return kubernetesClusterId;
 	}
-    
-    
+
+
+    public String getInstanceId() {
+        return instanceId;
+    }
+
+    public void setInstanceId(String instanceId) {
+        this.instanceId = instanceId;
+    }
+
+
+    public String getClusterInstanceId() {
+        return clusterInstanceId;
+    }
+
+    public void setClusterInstanceId(String clusterInstanceId) {
+        this.clusterInstanceId = clusterInstanceId;
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/b575c7d6/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/event/publisher/CartridgeAgentEventPublisher.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/event/publisher/CartridgeAgentEventPublisher.java b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/event/publisher/CartridgeAgentEventPublisher.java
index b080c20..5b01a4f 100644
--- a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/event/publisher/CartridgeAgentEventPublisher.java
+++ b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/event/publisher/CartridgeAgentEventPublisher.java
@@ -51,9 +51,11 @@ public class CartridgeAgentEventPublisher {
 			InstanceStartedEvent event = new InstanceStartedEvent(
 					CartridgeAgentConfiguration.getInstance().getServiceName(),
 					CartridgeAgentConfiguration.getInstance().getClusterId(),
+					CartridgeAgentConfiguration.getInstance().getMemberId(),
+					CartridgeAgentConfiguration.getInstance().getInstanceId(),
+					CartridgeAgentConfiguration.getInstance().getClusterInstanceId(),
 					CartridgeAgentConfiguration.getInstance().getNetworkPartitionId(),
-					CartridgeAgentConfiguration.getInstance().getPartitionId(),
-					CartridgeAgentConfiguration.getInstance().getMemberId(), null);
+					CartridgeAgentConfiguration.getInstance().getPartitionId());
 			String topic = Util.getMessageTopicName(event);
 			EventPublisher eventPublisher = EventPublisherPool
 					.getPublisher(topic);
@@ -78,9 +80,11 @@ public class CartridgeAgentEventPublisher {
 			InstanceActivatedEvent event = new InstanceActivatedEvent(
 					CartridgeAgentConfiguration.getInstance().getServiceName(),
 					CartridgeAgentConfiguration.getInstance().getClusterId(),
+					CartridgeAgentConfiguration.getInstance().getMemberId(),
+					CartridgeAgentConfiguration.getInstance().getInstanceId(),
+					CartridgeAgentConfiguration.getInstance().getClusterInstanceId(),
 					CartridgeAgentConfiguration.getInstance().getNetworkPartitionId(),
-					CartridgeAgentConfiguration.getInstance().getPartitionId(),
-					CartridgeAgentConfiguration.getInstance().getMemberId(), null);
+					CartridgeAgentConfiguration.getInstance().getPartitionId());
 
 			// Event publisher connection will
 			String topic = Util.getMessageTopicName(event);
@@ -115,9 +119,11 @@ public class CartridgeAgentEventPublisher {
 			InstanceReadyToShutdownEvent event = new InstanceReadyToShutdownEvent(
 					CartridgeAgentConfiguration.getInstance().getServiceName(),
 					CartridgeAgentConfiguration.getInstance().getClusterId(),
+					CartridgeAgentConfiguration.getInstance().getMemberId(),
+					CartridgeAgentConfiguration.getInstance().getInstanceId(),
+					CartridgeAgentConfiguration.getInstance().getClusterInstanceId(),
 					CartridgeAgentConfiguration.getInstance().getNetworkPartitionId(),
-					CartridgeAgentConfiguration.getInstance().getPartitionId(),
-					CartridgeAgentConfiguration.getInstance().getMemberId(), null);
+					CartridgeAgentConfiguration.getInstance().getPartitionId());
 			String topic = Util.getMessageTopicName(event);
 			EventPublisher eventPublisher = EventPublisherPool
 					.getPublisher(topic);
@@ -141,9 +147,11 @@ public class CartridgeAgentEventPublisher {
 			InstanceMaintenanceModeEvent event = new InstanceMaintenanceModeEvent(
 					CartridgeAgentConfiguration.getInstance().getServiceName(),
 					CartridgeAgentConfiguration.getInstance().getClusterId(),
+					CartridgeAgentConfiguration.getInstance().getMemberId(),
+					CartridgeAgentConfiguration.getInstance().getInstanceId(),
+					CartridgeAgentConfiguration.getInstance().getClusterInstanceId(),
 					CartridgeAgentConfiguration.getInstance().getNetworkPartitionId(),
-					CartridgeAgentConfiguration.getInstance().getPartitionId(),
-					CartridgeAgentConfiguration.getInstance().getMemberId(), null);
+					CartridgeAgentConfiguration.getInstance().getPartitionId());
 			String topic = Util.getMessageTopicName(event);
 			EventPublisher eventPublisher = EventPublisherPool
 					.getPublisher(topic);

http://git-wip-us.apache.org/repos/asf/stratos/blob/b575c7d6/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/context/CloudControllerContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/context/CloudControllerContext.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/context/CloudControllerContext.java
index 0dfb371..5c19218 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/context/CloudControllerContext.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/context/CloudControllerContext.java
@@ -561,13 +561,13 @@ public class CloudControllerContext implements Serializable {
 
     public KubernetesGroup getKubernetesGroup(String groupId) throws NonExistingKubernetesGroupException {
         if (StringUtils.isEmpty(groupId)) {
-            throw new NonExistingKubernetesGroupException("Cannot find for empty group id");
+            throw new NonExistingKubernetesGroupException("Kubernetes group id is empty");
         }
         KubernetesGroup kubernetesGroup = kubernetesGroupsMap.get(groupId);
         if (kubernetesGroup != null) {
             return kubernetesGroup;
         }
-        throw new NonExistingKubernetesGroupException("Kubernetes group not found for id: " + groupId);
+        throw new NonExistingKubernetesGroupException("Kubernetes group not found: [group-id]: " + groupId);
     }
 
     public KubernetesGroup getKubernetesGroupContainingHost(String hostId) throws NonExistingKubernetesGroupException {

http://git-wip-us.apache.org/repos/asf/stratos/blob/b575c7d6/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/Cartridge.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/Cartridge.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/Cartridge.java
index 4303fc0..c3d5d03 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/Cartridge.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/Cartridge.java
@@ -65,9 +65,7 @@ public class Cartridge implements Serializable{
     private List<AppType> appTypeMappings;
     
     private String serviceGroup;
-    
-    private String deployerType;
-    
+
     /**
      * Property map of this Cartridge.
      */
@@ -386,15 +384,6 @@ public class Cartridge implements Serializable{
 		this.container = container;
 	}
 
-	public String getDeployerType() {
-		return deployerType;
-	}
-
-	public void setDeployerType(String deployerType) {
-		this.deployerType = deployerType;
-	}
-
-
     public String[] getExportingProperties() {
         return exportingProperties;
     }

http://git-wip-us.apache.org/repos/asf/stratos/blob/b575c7d6/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/InstanceContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/InstanceContext.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/InstanceContext.java
new file mode 100644
index 0000000..8664d5e
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/InstanceContext.java
@@ -0,0 +1,100 @@
+/*
+ * 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.domain;
+
+import org.apache.stratos.common.Properties;
+
+/**
+ * Instance context defines information required for starting an IaaS instance.
+ */
+public class InstanceContext {
+    private String clusterId;
+    private String clusterInstanceId;
+    private long initTime;
+    private long obsoleteExpiryTime;
+    private String networkPartitionId;
+    private Partition partition;
+    private String cartridgeType;
+    private Properties properties;
+
+    public String getClusterId() {
+        return clusterId;
+    }
+
+    public void setClusterId(String clusterId) {
+        this.clusterId = clusterId;
+    }
+
+    public String getNetworkPartitionId() {
+        return networkPartitionId;
+    }
+
+    public void setNetworkPartitionId(String networkPartitionId) {
+        this.networkPartitionId = networkPartitionId;
+    }
+
+    public Partition getPartition() {
+        return partition;
+    }
+
+    public void setPartition(Partition partition) {
+        this.partition = partition;
+    }
+
+    public String getCartridgeType() {
+        return cartridgeType;
+    }
+
+    public void setCartridgeType(String cartridgeType) {
+        this.cartridgeType = cartridgeType;
+    }
+
+    public Properties getProperties() {
+        return properties;
+    }
+
+    public void setProperties(Properties properties) {
+        this.properties = properties;
+    }
+
+    public String getClusterInstanceId() {
+        return clusterInstanceId;
+    }
+
+    public void setClusterInstanceId(String clusterInstanceId) {
+        this.clusterInstanceId = clusterInstanceId;
+    }
+
+    public long getInitTime() {
+        return initTime;
+    }
+
+    public void setInitTime(long initTime) {
+        this.initTime = initTime;
+    }
+
+    public long getObsoleteExpiryTime() {
+        return obsoleteExpiryTime;
+    }
+
+    public void setObsoleteExpiryTime(long obsoleteExpiryTime) {
+        this.obsoleteExpiryTime = obsoleteExpiryTime;
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/b575c7d6/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/InstanceMetadata.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/InstanceMetadata.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/InstanceMetadata.java
new file mode 100644
index 0000000..d67c019
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/InstanceMetadata.java
@@ -0,0 +1,107 @@
+/*
+ * 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.domain;
+
+/**
+ * Instance metadata.
+ */
+public class InstanceMetadata {
+    private String hostname;
+    private String hypervisor;
+    private int ram;
+    private String imageId;
+    private int loginPort;
+    private String operatingSystemName;
+    private String operatingSystemVersion;
+    private String operatingSystemArchitecture;
+    private boolean operatingSystem64bit;
+
+    public String getHostname() {
+        return hostname;
+    }
+
+    public void setHostname(String hostname) {
+        this.hostname = hostname;
+    }
+
+    public String getHypervisor() {
+        return hypervisor;
+    }
+
+    public void setHypervisor(String hypervisor) {
+        this.hypervisor = hypervisor;
+    }
+
+    public int getRam() {
+        return ram;
+    }
+
+    public void setRam(int ram) {
+        this.ram = ram;
+    }
+
+    public String getImageId() {
+        return imageId;
+    }
+
+    public void setImageId(String imageId) {
+        this.imageId = imageId;
+    }
+
+    public int getLoginPort() {
+        return loginPort;
+    }
+
+    public void setLoginPort(int loginPort) {
+        this.loginPort = loginPort;
+    }
+
+    public String getOperatingSystemName() {
+        return operatingSystemName;
+    }
+
+    public void setOperatingSystemName(String operatingSystemName) {
+        this.operatingSystemName = operatingSystemName;
+    }
+
+    public String getOperatingSystemVersion() {
+        return operatingSystemVersion;
+    }
+
+    public void setOperatingSystemVersion(String operatingSystemVersion) {
+        this.operatingSystemVersion = operatingSystemVersion;
+    }
+
+    public String getOperatingSystemArchitecture() {
+        return operatingSystemArchitecture;
+    }
+
+    public void setOperatingSystemArchitecture(String operatingSystemArchitecture) {
+        this.operatingSystemArchitecture = operatingSystemArchitecture;
+    }
+
+    public boolean isOperatingSystem64bit() {
+        return operatingSystem64bit;
+    }
+
+    public void setOperatingSystem64bit(boolean operatingSystem64bit) {
+        this.operatingSystem64bit = operatingSystem64bit;
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/b575c7d6/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/MemberContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/MemberContext.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/MemberContext.java
index a5ab367..0201739 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/MemberContext.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/MemberContext.java
@@ -30,37 +30,41 @@ import java.io.Serializable;
 public class MemberContext implements Serializable {
 
     private static final long serialVersionUID = -388327475844701869L;
-    // id of the member
+
+    // Cartridge type this member belongs to
+    private String cartridgeType;
+    // Cluster id of this member
+    private String clusterId;
+    // Member id generated by cloud controller
     private String memberId;
-    // corresponding jclouds node id
-    private String nodeId;
-    // instance id - derived from nodeId
+    // Instance id generated by the IaaS
     private String instanceId;
-    // cluster id of this member
-    private String clusterId;
-    // partition this member is in.
+    // Instance id of the application hierarchy member belongs to
+    private String clusterInstanceId;
+
+    // Partition this member is in
     private Partition partition;
-    // cartridge type this member belongs to.
-    private String cartridgeType;
-    // private ip
+    // Private ip address
     private String privateIpAddress;
-    // public ip
+    // Public ip address
     private String publicIpAddress;
-    // manually allocated ip
+    // Manually allocated ip
     private String allocatedIpAddress;
-    // member initiated time
+    // Member initiated time
     private long initTime;
-    // lb cluster id of this member
+    // LB cluster id of this member
     private String lbClusterId;
-    //network partition id
+    // Network partition id
     private String networkPartitionId;
-    //member expiry period on the topology
+    // Member expiry period on the topology
     private long obsoleteExpiryTime;
-    //member obsolete init time
+    // Member obsolete init time
     private long obsoleteInitTime;
-
+    // Instance metadata generated by the IaaS
+    private InstanceMetadata instanceMetadata;
+    // Properties
     private Properties properties;
-    
+
     public MemberContext(String id, String clusterId, Partition partition) {
         this.memberId = id;
         this.clusterId = clusterId;
@@ -80,27 +84,27 @@ public class MemberContext implements Serializable {
     public String getMemberId() {
         return memberId;
     }
+
     public void setMemberId(String memberId) {
         this.memberId = memberId;
     }
-    public String getNodeId() {
-        return nodeId;
-    }
-    public void setNodeId(String nodeId) {
-        this.nodeId = nodeId;
-    }
+
     public String getClusterId() {
         return clusterId;
     }
+
     public void setClusterId(String clusterId) {
         this.clusterId = clusterId;
     }
+
     public String getCartridgeType() {
         return cartridgeType;
     }
+
     public void setCartridgeType(String cartridgeType) {
         this.cartridgeType = cartridgeType;
     }
+
     public Partition getPartition() {
         return partition;
     }
@@ -149,7 +153,6 @@ public class MemberContext implements Serializable {
         this.lbClusterId = lbClusterId;
     }
 
-
     public String getNetworkPartitionId() {
         return networkPartitionId;
     }
@@ -166,7 +169,7 @@ public class MemberContext implements Serializable {
 				+ ((clusterId == null) ? 0 : clusterId.hashCode());
 		result = prime * result
 				+ ((memberId == null) ? 0 : memberId.hashCode());
-		result = prime * result + ((nodeId == null) ? 0 : nodeId.hashCode());
+		result = prime * result + ((instanceId == null) ? 0 : instanceId.hashCode());
 		return result;
 	}
 
@@ -189,10 +192,10 @@ public class MemberContext implements Serializable {
 				return false;
 		} else if (!memberId.equals(other.memberId))
 			return false;
-		if (nodeId == null) {
-			if (other.nodeId != null)
+		if (instanceId == null) {
+			if (other.instanceId != null)
 				return false;
-		} else if (!nodeId.equals(other.nodeId))
+		} else if (!instanceId.equals(other.instanceId))
 			return false;
 		return true;
 	}
@@ -229,14 +232,30 @@ public class MemberContext implements Serializable {
         this.properties = properties;
     }
 
+    public InstanceMetadata getInstanceMetadata() {
+        return instanceMetadata;
+    }
+
+    public void setInstanceMetadata(InstanceMetadata instanceMetadata) {
+        this.instanceMetadata = instanceMetadata;
+    }
+
+    public void setClusterInstanceId(String clusterInstanceId) {
+        this.clusterInstanceId = clusterInstanceId;
+    }
+
+    public String getClusterInstanceId() {
+        return clusterInstanceId;
+    }
+
     @Override
     public String toString() {
-        return "MemberContext [memberId=" + memberId + ", nodeId=" + nodeId + ", instanceId="
-                + instanceId + ", clusterId=" + clusterId + ", partition=" + partition
+        return "MemberContext [memberId=" + memberId + ", instanceId=" + instanceId
+                + ", clusterId=" + clusterId + ", partition=" + partition
                 + ", cartridgeType=" + cartridgeType + ", privateIpAddress=" + privateIpAddress
                 + ", publicIpAddress=" + publicIpAddress + ", allocatedIpAddress="
                 + allocatedIpAddress + ", initTime=" + initTime + ", lbClusterId=" + lbClusterId
-                + ", networkPartitionId=" + networkPartitionId + ", properties=" + properties + "]";
+                + ", networkPartitionId=" + networkPartitionId + ", instanceMetadata=" + instanceMetadata +
+                ", properties=" + properties + "]";
     }
-    
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/b575c7d6/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/exception/CartridgeNotFoundException.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/exception/CartridgeNotFoundException.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/exception/CartridgeNotFoundException.java
new file mode 100644
index 0000000..899b21f
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/exception/CartridgeNotFoundException.java
@@ -0,0 +1,44 @@
+/*
+ * 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.exception;
+
+public class CartridgeNotFoundException extends Exception {
+    
+    private static final long serialVersionUID = -6326227079367867222L;
+	private String message;
+
+    public CartridgeNotFoundException(String msg) {
+        super(msg);
+        this.setMessage(msg);
+    }
+    
+    public CartridgeNotFoundException(String msg, Exception ex) {
+        super(msg, ex);
+        this.setMessage(msg);
+    }
+    
+    private void setMessage(String msg) {
+    	this.message = msg;
+	}
+
+	public String getMessage() {
+        return this.message;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/b575c7d6/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/exception/UnregisteredCartridgeException.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/exception/UnregisteredCartridgeException.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/exception/UnregisteredCartridgeException.java
deleted file mode 100644
index af7da00..0000000
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/exception/UnregisteredCartridgeException.java
+++ /dev/null
@@ -1,44 +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.exception;
-
-public class UnregisteredCartridgeException extends Exception {
-    
-    private static final long serialVersionUID = -6326227079367867222L;
-	private String message;
-
-    public UnregisteredCartridgeException(String msg) {
-        super(msg);
-        this.setMessage(msg);
-    }
-    
-    public UnregisteredCartridgeException(String msg, Exception ex) {
-        super(msg, ex);
-        this.setMessage(msg);
-    }
-    
-    private void setMessage(String msg) {
-    	this.message = msg;
-	}
-
-	public String getMessage() {
-        return this.message;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/stratos/blob/b575c7d6/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 4c80d4f..2a9137a 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
@@ -24,10 +24,7 @@ import java.util.List;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.cloud.controller.context.CloudControllerContext;
-import org.apache.stratos.cloud.controller.domain.Cartridge;
-import org.apache.stratos.cloud.controller.domain.ClusterContext;
-import org.apache.stratos.cloud.controller.domain.ContainerClusterContext;
-import org.apache.stratos.cloud.controller.domain.PortMapping;
+import org.apache.stratos.cloud.controller.domain.*;
 import org.apache.stratos.cloud.controller.util.CloudControllerUtil;
 import org.apache.stratos.common.Properties;
 import org.apache.stratos.common.Property;
@@ -39,15 +36,15 @@ import org.apache.stratos.kubernetes.client.model.Port;
 import com.google.common.base.Function;
 
 /**
- * Is responsible for converting a {@link ContainerClusterContext} object to a Kubernetes
+ * Is responsible for converting a MemberContext object to a Kubernetes
  * {@link Container} Object.
  */
-public class ContainerClusterContextToKubernetesContainer implements Function<ContainerClusterContext, Container> {
+public class ContainerClusterContextToKubernetesContainer implements Function<MemberContext, Container> {
 
     private static final Log log = LogFactory.getLog(ContainerClusterContextToKubernetesContainer.class);
 
     @Override
-    public Container apply(ContainerClusterContext memberContext) {
+    public Container apply(MemberContext memberContext) {
         String clusterId = memberContext.getClusterId();
         ClusterContext clusterContext = CloudControllerContext.getInstance().getClusterContext(clusterId);
 
@@ -93,7 +90,7 @@ public class ContainerClusterContextToKubernetesContainer implements Function<Co
         return portList.toArray(ports);
     }
 
-    private EnvironmentVariable[] getEnvironmentVars(ContainerClusterContext memberCtxt, ClusterContext ctxt) {
+    private EnvironmentVariable[] getEnvironmentVars(MemberContext memberCtxt, ClusterContext ctxt) {
 
         String kubernetesClusterId = CloudControllerUtil.getProperty(ctxt.getProperties(),
                 StratosConstants.KUBERNETES_CLUSTER_ID);

http://git-wip-us.apache.org/repos/asf/stratos/blob/b575c7d6/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/ContainerClusterContextToKubernetesService.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/ContainerClusterContextToKubernetesService.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/ContainerClusterContextToKubernetesService.java
index 50f61bd..d6f0a0f 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/ContainerClusterContextToKubernetesService.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/ContainerClusterContextToKubernetesService.java
@@ -22,6 +22,7 @@ import org.apache.stratos.cloud.controller.context.CloudControllerContext;
 import org.apache.stratos.cloud.controller.domain.ClusterContext;
 import org.apache.stratos.cloud.controller.domain.ContainerClusterContext;
 import org.apache.stratos.cloud.controller.domain.KubernetesClusterContext;
+import org.apache.stratos.cloud.controller.domain.MemberContext;
 import org.apache.stratos.cloud.controller.util.CloudControllerUtil;
 import org.apache.stratos.common.constants.StratosConstants;
 import org.apache.stratos.kubernetes.client.model.Selector;
@@ -33,10 +34,10 @@ import com.google.common.base.Function;
  * Is responsible for converting a {@link ContainerClusterContext} object to a Kubernetes
  * {@link Service} Object.
  */
-public class ContainerClusterContextToKubernetesService implements Function<ContainerClusterContext, Service> {
+public class ContainerClusterContextToKubernetesService implements Function<MemberContext, Service> {
 
     @Override
-    public Service apply(ContainerClusterContext memberContext) {
+    public Service apply(MemberContext memberContext) {
 
         String clusterId = memberContext.getClusterId();
         ClusterContext clusterContext = CloudControllerContext.getInstance().getClusterContext(clusterId);

http://git-wip-us.apache.org/repos/asf/stratos/blob/b575c7d6/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/ContainerClusterContextToReplicationController.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/ContainerClusterContextToReplicationController.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/ContainerClusterContextToReplicationController.java
index e01c474..af63a3f 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/ContainerClusterContextToReplicationController.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/ContainerClusterContextToReplicationController.java
@@ -21,6 +21,7 @@ package org.apache.stratos.cloud.controller.functions;
 import org.apache.stratos.cloud.controller.context.CloudControllerContext;
 import org.apache.stratos.cloud.controller.domain.ClusterContext;
 import org.apache.stratos.cloud.controller.domain.ContainerClusterContext;
+import org.apache.stratos.cloud.controller.domain.MemberContext;
 import org.apache.stratos.cloud.controller.util.CloudControllerUtil;
 import org.apache.stratos.common.constants.StratosConstants;
 import org.apache.stratos.kubernetes.client.model.Container;
@@ -38,18 +39,18 @@ import com.google.common.base.Function;
  * {@link ReplicationController} Object.
  */
 public class ContainerClusterContextToReplicationController implements
-        Function<ContainerClusterContext, ReplicationController> {
+        Function<MemberContext, ReplicationController> {
 
     @Override
-    public ReplicationController apply(ContainerClusterContext memberContext) {
+    public ReplicationController apply(MemberContext memberContext) {
 
         String clusterId = memberContext.getClusterId();
         ClusterContext clusterContext = CloudControllerContext.getInstance().getClusterContext(clusterId);
 
-        ReplicationController contr = new ReplicationController();
-        contr.setId(clusterContext.getClusterId());
-        contr.setKind("ReplicationController");
-        contr.setApiVersion("v1beta1");
+        ReplicationController replicationController = new ReplicationController();
+        replicationController.setId(clusterContext.getClusterId());
+        replicationController.setKind("ReplicationController");
+        replicationController.setApiVersion("v1beta1");
         State desiredState = new State();
         String minReplicas = CloudControllerUtil.getProperty(clusterContext.getProperties(),
                 StratosConstants.KUBERNETES_MIN_REPLICAS);
@@ -76,13 +77,13 @@ public class ContainerClusterContextToReplicationController implements
         podTemplate.setLabels(l1);
 
         desiredState.setPodTemplate(podTemplate);
-        contr.setDesiredState(desiredState);
+        replicationController.setDesiredState(desiredState);
 
         Label l2 = new Label();
         l2.setName(clusterContext.getClusterId());
-        contr.setLabels(l2);
+        replicationController.setLabels(l2);
 
-        return contr;
+        return replicationController;
     }
 
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/b575c7d6/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/Iaas.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/Iaas.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/Iaas.java
index 341d6f1..4270f19 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/Iaas.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/Iaas.java
@@ -18,13 +18,9 @@
  */
 package org.apache.stratos.cloud.controller.iaases;
 
-import org.apache.stratos.cloud.controller.domain.ClusterContext;
-import org.apache.stratos.cloud.controller.domain.IaasProvider;
-import org.apache.stratos.cloud.controller.domain.MemberContext;
-import org.apache.stratos.cloud.controller.domain.Partition;
+import org.apache.stratos.cloud.controller.domain.*;
 import org.apache.stratos.cloud.controller.exception.*;
 import org.apache.stratos.cloud.controller.iaases.validators.PartitionValidator;
-import org.jclouds.compute.domain.NodeMetadata;
 
 /**
  * All IaaSes that are going to support by Cloud Controller, should extend this abstract class.
@@ -55,11 +51,10 @@ public abstract class Iaas {
     /**
      * Create vm/container instance.
      *
-     * @param clusterContext
      * @param memberContext
-     * @return
+     * @return updated memberContext
      */
-    public abstract NodeMetadata createInstance(ClusterContext clusterContext, MemberContext memberContext);
+    public abstract MemberContext createInstance(MemberContext memberContext) throws CartridgeNotFoundException;
 
     /**
      * This will deallocate/release the given IP address back to pool.
@@ -147,13 +142,18 @@ public abstract class Iaas {
      */
     public abstract String getIaasDevice(String device);
 
-    public abstract void allocateIpAddress(String clusterId, MemberContext memberContext, Partition partition,
-                                           String cartridgeType, NodeMetadata node);
+    public abstract void allocateIpAddress(String clusterId, MemberContext memberContext, Partition partition);
 
     /**
      * This method provides a way to set payload.
      */
     public abstract void setDynamicPayload(byte[] payload);
 
+    /**
+     * Terminate an instance.
+     * @param memberContext
+     * @throws InvalidCartridgeTypeException
+     * @throws InvalidMemberException
+     */
     public abstract void terminateInstance(MemberContext memberContext) throws InvalidCartridgeTypeException, InvalidMemberException;
 }