You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by re...@apache.org on 2014/11/04 06:56:04 UTC

[6/8] udpating the cluster status

http://git-wip-us.apache.org/repos/asf/stratos/blob/d45448f3/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 21878ad..d7d9400 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
@@ -20,7 +20,6 @@ package org.apache.stratos.cloud.controller.impl;
 
 import com.google.common.collect.ImmutableSet;
 import com.google.common.net.InetAddresses;
-
 import org.apache.commons.collections.ListUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.logging.Log;
@@ -54,6 +53,8 @@ import org.apache.stratos.kubernetes.client.model.Label;
 import org.apache.stratos.kubernetes.client.model.Pod;
 import org.apache.stratos.kubernetes.client.model.ReplicationController;
 import org.apache.stratos.kubernetes.client.model.Service;
+import org.apache.stratos.messaging.domain.topology.Cluster;
+import org.apache.stratos.messaging.domain.topology.ClusterStatus;
 import org.apache.stratos.messaging.domain.topology.Member;
 import org.apache.stratos.messaging.domain.topology.Cluster;
 import org.apache.stratos.messaging.domain.topology.ClusterStatus;
@@ -68,7 +69,6 @@ import org.wso2.carbon.registry.core.exceptions.RegistryException;
 
 import java.util.*;
 import java.util.Map.Entry;
-import java.util.Properties;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.Future;
@@ -76,65 +76,64 @@ import java.util.concurrent.Future;
 /**
  * Cloud Controller Service is responsible for starting up new server instances,
  * terminating already started instances, providing pending instance count etc.
- * 
  */
 public class CloudControllerServiceImpl implements CloudControllerService {
 
-	private static final Log LOG = LogFactory
-			.getLog(CloudControllerServiceImpl.class);
-	private FasterLookUpDataHolder dataHolder = FasterLookUpDataHolder
-			.getInstance();
-
-	public CloudControllerServiceImpl() {
-		// acquire serialized data from registry
-		acquireData();
-	}
-
-	private void acquireData() {
-
-		Object obj = RegistryManager.getInstance().retrieve();
-		if (obj != null) {
-			try {
-				Object dataObj = Deserializer
-						.deserializeFromByteArray((byte[]) obj);
-				if (dataObj instanceof FasterLookUpDataHolder) {
-					FasterLookUpDataHolder serializedObj = (FasterLookUpDataHolder) dataObj;
-					FasterLookUpDataHolder currentData = FasterLookUpDataHolder
-							.getInstance();
-
-					// assign necessary data
-					currentData.setClusterIdToContext(serializedObj.getClusterIdToContext());
-					currentData.setMemberIdToContext(serializedObj.getMemberIdToContext());
-					currentData.setClusterIdToMemberContext(serializedObj.getClusterIdToMemberContext());
-					currentData.setCartridges(serializedObj.getCartridges());
-					currentData.setKubClusterIdToKubClusterContext(serializedObj.getKubClusterIdToKubClusterContext());
-					currentData.setServiceGroups(serializedObj.getServiceGroups());
-
-					if(LOG.isDebugEnabled()) {
-					    
-					    LOG.debug("Cloud Controller Data is retrieved from registry.");
-					}
-				} else {
-				    if(LOG.isDebugEnabled()) {
-				        
-				        LOG.debug("Cloud Controller Data cannot be found in registry.");
-				    }
-				}
-			} catch (Exception e) {
-
-				String msg = "Unable to acquire data from Registry. Hence, any historical data will not get reflected.";
-				LOG.warn(msg, e);
-			}
-
-		}
-	}
-
-    public void deployCartridgeDefinition(CartridgeConfig cartridgeConfig) throws InvalidCartridgeDefinitionException, 
-    InvalidIaasProviderException {
-        
+    private static final Log LOG = LogFactory
+            .getLog(CloudControllerServiceImpl.class);
+    private FasterLookUpDataHolder dataHolder = FasterLookUpDataHolder
+            .getInstance();
+
+    public CloudControllerServiceImpl() {
+        // acquire serialized data from registry
+        acquireData();
+    }
+
+    private void acquireData() {
+
+        Object obj = RegistryManager.getInstance().retrieve();
+        if (obj != null) {
+            try {
+                Object dataObj = Deserializer
+                        .deserializeFromByteArray((byte[]) obj);
+                if (dataObj instanceof FasterLookUpDataHolder) {
+                    FasterLookUpDataHolder serializedObj = (FasterLookUpDataHolder) dataObj;
+                    FasterLookUpDataHolder currentData = FasterLookUpDataHolder
+                            .getInstance();
+
+                    // assign necessary data
+                    currentData.setClusterIdToContext(serializedObj.getClusterIdToContext());
+                    currentData.setMemberIdToContext(serializedObj.getMemberIdToContext());
+                    currentData.setClusterIdToMemberContext(serializedObj.getClusterIdToMemberContext());
+                    currentData.setCartridges(serializedObj.getCartridges());
+                    currentData.setKubClusterIdToKubClusterContext(serializedObj.getKubClusterIdToKubClusterContext());
+                    currentData.setServiceGroups(serializedObj.getServiceGroups());
+
+                    if (LOG.isDebugEnabled()) {
+
+                        LOG.debug("Cloud Controller Data is retrieved from registry.");
+                    }
+                } else {
+                    if (LOG.isDebugEnabled()) {
+
+                        LOG.debug("Cloud Controller Data cannot be found in registry.");
+                    }
+                }
+            } catch (Exception e) {
+
+                String msg = "Unable to acquire data from Registry. Hence, any historical data will not get reflected.";
+                LOG.warn(msg, e);
+            }
+
+        }
+    }
+
+    public void deployCartridgeDefinition(CartridgeConfig cartridgeConfig) throws InvalidCartridgeDefinitionException,
+            InvalidIaasProviderException {
+
         handleNullObject(cartridgeConfig, "Invalid Cartridge Definition: Definition is null.");
 
-        if(LOG.isDebugEnabled()){
+        if (LOG.isDebugEnabled()) {
             LOG.debug("Cartridge definition: " + cartridgeConfig.toString());
         }
 
@@ -144,16 +143,16 @@ public class CloudControllerServiceImpl implements CloudControllerService {
             cartridge = CloudControllerUtil.toCartridge(cartridgeConfig);
         } catch (Exception e) {
             String msg =
-                         "Invalid Cartridge Definition: Cartridge Type: " +
-                                 cartridgeConfig.getType()+
-                                 ". Cause: Cannot instantiate a Cartridge Instance with the given Config. "+e.getMessage();
+                    "Invalid Cartridge Definition: Cartridge Type: " +
+                            cartridgeConfig.getType() +
+                            ". Cause: Cannot instantiate a Cartridge Instance with the given Config. " + e.getMessage();
             LOG.error(msg, e);
             throw new InvalidCartridgeDefinitionException(msg, e);
         }
 
         List<IaasProvider> iaases = cartridge.getIaases();
-        
-		if (!StratosConstants.KUBERNETES_DEPLOYER_TYPE.equals(cartridge.getDeployerType())) {
+
+        if (!StratosConstants.KUBERNETES_DEPLOYER_TYPE.equals(cartridge.getDeployerType())) {
             if (iaases == null || iaases.isEmpty()) {
                 String msg = "Invalid Cartridge Definition: Cartridge Type: "
                         + cartridgeConfig.getType()
@@ -177,19 +176,19 @@ public class CloudControllerServiceImpl implements CloudControllerService {
 
         // TODO transaction begins
         String cartridgeType = cartridge.getType();
-        if(dataHolder.getCartridge(cartridgeType) != null) {
-        	Cartridge cartridgeToBeRemoved = dataHolder.getCartridge(cartridgeType);
-        	// undeploy
+        if (dataHolder.getCartridge(cartridgeType) != null) {
+            Cartridge cartridgeToBeRemoved = dataHolder.getCartridge(cartridgeType);
+            // undeploy
             try {
-				undeployCartridgeDefinition(cartridgeToBeRemoved.getType());
-			} catch (InvalidCartridgeTypeException e) {
-				//ignore
-			}
+                undeployCartridgeDefinition(cartridgeToBeRemoved.getType());
+            } catch (InvalidCartridgeTypeException e) {
+                //ignore
+            }
             populateNewCartridge(cartridge, cartridgeToBeRemoved);
         }
-        
+
         dataHolder.addCartridge(cartridge);
-        
+
         // persist
         persist();
 
@@ -198,211 +197,211 @@ public class CloudControllerServiceImpl implements CloudControllerService {
 
         TopologyBuilder.handleServiceCreated(cartridgeList);
         // transaction ends
-        
+
         LOG.info("Successfully deployed the Cartridge definition: " + cartridgeType);
     }
 
     private void populateNewCartridge(Cartridge cartridge,
-			Cartridge cartridgeToBeRemoved) {
-    	
-    	List<IaasProvider> newIaasProviders = cartridge.getIaases();
-    	Map<String, IaasProvider> oldPartitionToIaasMap = cartridgeToBeRemoved.getPartitionToIaasProvider();
-    	
-    	for (Entry<String, IaasProvider> entry : oldPartitionToIaasMap.entrySet()) {
-    	    if (entry == null) {
-    	        continue;
-    	    }
-    	    String partitionId = entry.getKey();
-			IaasProvider oldIaasProvider = entry.getValue();
-			if (newIaasProviders.contains(oldIaasProvider)) {
-				if (LOG.isDebugEnabled()) {
-					LOG.debug("Copying a partition from the Cartridge that is undeployed, to the new Cartridge. "
-							+ "[partition id] : "+partitionId+" [cartridge type] "+cartridge.getType() );
-				}
-				cartridge.addIaasProvider(partitionId, newIaasProviders.get(newIaasProviders.indexOf(oldIaasProvider)));
-			}
-		}
-		
-	}
+                                      Cartridge cartridgeToBeRemoved) {
 
-	public void undeployCartridgeDefinition(String cartridgeType) throws InvalidCartridgeTypeException {
+        List<IaasProvider> newIaasProviders = cartridge.getIaases();
+        Map<String, IaasProvider> oldPartitionToIaasMap = cartridgeToBeRemoved.getPartitionToIaasProvider();
+
+        for (Entry<String, IaasProvider> entry : oldPartitionToIaasMap.entrySet()) {
+            if (entry == null) {
+                continue;
+            }
+            String partitionId = entry.getKey();
+            IaasProvider oldIaasProvider = entry.getValue();
+            if (newIaasProviders.contains(oldIaasProvider)) {
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug("Copying a partition from the Cartridge that is undeployed, to the new Cartridge. "
+                            + "[partition id] : " + partitionId + " [cartridge type] " + cartridge.getType());
+                }
+                cartridge.addIaasProvider(partitionId, newIaasProviders.get(newIaasProviders.indexOf(oldIaasProvider)));
+            }
+        }
+
+    }
+
+    public void undeployCartridgeDefinition(String cartridgeType) throws InvalidCartridgeTypeException {
 
         Cartridge cartridge = null;
-        if((cartridge = dataHolder.getCartridge(cartridgeType)) != null) {
+        if ((cartridge = dataHolder.getCartridge(cartridgeType)) != null) {
             if (dataHolder.getCartridges().remove(cartridge)) {
-            	// invalidate partition validation cache
-            	dataHolder.removeFromCartridgeTypeToPartitionIds(cartridgeType);
-            	
-            	if (LOG.isDebugEnabled()) {
-            		LOG.debug("Partition cache invalidated for cartridge "+cartridgeType);
-            	}
-            	
+                // invalidate partition validation cache
+                dataHolder.removeFromCartridgeTypeToPartitionIds(cartridgeType);
+
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug("Partition cache invalidated for cartridge " + cartridgeType);
+                }
+
                 persist();
-                
+
                 // sends the service removed event
                 List<Cartridge> cartridgeList = new ArrayList<Cartridge>();
                 cartridgeList.add(cartridge);
                 TopologyBuilder.handleServiceRemoved(cartridgeList);
-                
-                if(LOG.isInfoEnabled()) {
+
+                if (LOG.isInfoEnabled()) {
                     LOG.info("Successfully undeployed the Cartridge definition: " + cartridgeType);
                 }
                 return;
             }
         }
-        String msg = "Cartridge [type] "+cartridgeType+" is not a deployed Cartridge type.";
+        String msg = "Cartridge [type] " + cartridgeType + " is not a deployed Cartridge type.";
         LOG.error(msg);
         throw new InvalidCartridgeTypeException(msg);
     }
-    
+
     public void deployServiceGroup(ServiceGroup servicegroup) throws InvalidServiceGroupException {
-    	
-    	if (servicegroup == null) {
+
+        if (servicegroup == null) {
             String msg = "Invalid ServiceGroup Definition: Definition is null.";
             LOG.error(msg);
             throw new IllegalArgumentException(msg);
 
         }
-    	
-    	if(LOG.isDebugEnabled()) {
+
+        if (LOG.isDebugEnabled()) {
             LOG.debug("CloudControllerServiceImpl:deployServiceGroup:" + servicegroup.getName());
         }
-    	
-    	String [] subGroups = servicegroup.getCartridges();
-    	
 
-    	if(LOG.isDebugEnabled()) {
+        String[] subGroups = servicegroup.getCartridges();
+
+
+        if (LOG.isDebugEnabled()) {
             LOG.debug("CloudControllerServiceImpl:deployServiceGroup:subGroups" + subGroups);
             if (subGroups != null) {
-            	LOG.debug("CloudControllerServiceImpl:deployServiceGroup:subGroups:size" + subGroups.length);
+                LOG.debug("CloudControllerServiceImpl:deployServiceGroup:subGroups:size" + subGroups.length);
             } else {
-            	LOG.debug("CloudControllerServiceImpl:deployServiceGroup:subGroups: is null");
+                LOG.debug("CloudControllerServiceImpl:deployServiceGroup:subGroups: is null");
             }
         }
-    	
-    	
-    	Dependencies dependencies = servicegroup.getDependencies();
-    	
-    	if(LOG.isDebugEnabled()) {
+
+
+        Dependencies dependencies = servicegroup.getDependencies();
+
+        if (LOG.isDebugEnabled()) {
             LOG.debug("CloudControllerServiceImpl:deployServiceGroup:dependencies" + dependencies);
         }
-    	
-    	if (dependencies != null) {
-	    	String [] startupOrders = dependencies.getStartupOrders();
-	    	
-	    	if(LOG.isDebugEnabled()) {
-	            LOG.debug("CloudControllerServiceImpl:deployServiceGroup:startupOrders" + startupOrders);
-	            
-	            if (startupOrders != null) {
-	            	LOG.debug("CloudControllerServiceImpl:deployServiceGroup:startupOrder:size" + startupOrders.length);
-	            } else {
-	            	LOG.debug("CloudControllerServiceImpl:deployServiceGroup:startupOrder: is null");
-	            }
-	        }
-    	}
-    	
-    	dataHolder.addServiceGroup(servicegroup);
-    	
-    	this.persist();
-    	
+
+        if (dependencies != null) {
+            String[] startupOrders = dependencies.getStartupOrders();
+
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("CloudControllerServiceImpl:deployServiceGroup:startupOrders" + startupOrders);
+
+                if (startupOrders != null) {
+                    LOG.debug("CloudControllerServiceImpl:deployServiceGroup:startupOrder:size" + startupOrders.length);
+                } else {
+                    LOG.debug("CloudControllerServiceImpl:deployServiceGroup:startupOrder: is null");
+                }
+            }
+        }
+
+        dataHolder.addServiceGroup(servicegroup);
+
+        this.persist();
+
     }
-    
+
     public void undeployServiceGroup(String name) throws InvalidServiceGroupException {
-    	if(LOG.isDebugEnabled()) {
+        if (LOG.isDebugEnabled()) {
             LOG.debug("CloudControllerServiceImpl:undeployServiceGroup: " + name);
         }
-    	
+
         ServiceGroup serviceGroup = null;
-        
+
         serviceGroup = dataHolder.getServiceGroup(name);
-        
-        if (serviceGroup  != null) {
+
+        if (serviceGroup != null) {
             if (dataHolder.getServiceGroups().remove(serviceGroup)) {
                 persist();
-                if(LOG.isInfoEnabled()) {
+                if (LOG.isInfoEnabled()) {
                     LOG.info("Successfully undeployed the Service Group definition: " + serviceGroup);
                 }
                 return;
             }
-        } 
-        
+        }
+
         String msg = "ServiceGroup " + name + " is not a deployed Service Group definition";
         LOG.error(msg);
         throw new InvalidServiceGroupException(msg);
-    	
+
     }
-    
+
     @Override
-    public ServiceGroup getServiceGroup (String name) throws InvalidServiceGroupException {
-    	
-    	if(LOG.isDebugEnabled()) {
+    public ServiceGroup getServiceGroup(String name) throws InvalidServiceGroupException {
+
+        if (LOG.isDebugEnabled()) {
             LOG.debug("getServiceGroupDefinition:" + name);
         }
-    	
-    	ServiceGroup serviceGroup = this.dataHolder.getServiceGroup(name);
-    	
-    	if (serviceGroup == null) {
-    		if(LOG.isDebugEnabled()) {
+
+        ServiceGroup serviceGroup = this.dataHolder.getServiceGroup(name);
+
+        if (serviceGroup == null) {
+            if (LOG.isDebugEnabled()) {
                 LOG.debug("getServiceGroupDefinition: no entry found for service group " + name);
             }
-    		String msg = "ServiceGroup " + name + " is not a deployed Service Group definition";
-    		throw new InvalidServiceGroupException(msg);
-    	}
-    	
-    	return serviceGroup;
+            String msg = "ServiceGroup " + name + " is not a deployed Service Group definition";
+            throw new InvalidServiceGroupException(msg);
+        }
+
+        return serviceGroup;
     }
-    
-    public String [] getServiceGroupSubGroups (String name) throws InvalidServiceGroupException {
-    	ServiceGroup serviceGroup = this.getServiceGroup(name);
-    	if (serviceGroup == null) {
-    		throw new InvalidServiceGroupException("Invalid ServiceGroup " + serviceGroup);
-    	}
-    	
-    	return serviceGroup.getSubGroups();
+
+    public String[] getServiceGroupSubGroups(String name) throws InvalidServiceGroupException {
+        ServiceGroup serviceGroup = this.getServiceGroup(name);
+        if (serviceGroup == null) {
+            throw new InvalidServiceGroupException("Invalid ServiceGroup " + serviceGroup);
+        }
+
+        return serviceGroup.getSubGroups();
     }
-    
+
     /**
-     * 
+     *
      */
-    public String [] getServiceGroupCartridges (String name) throws InvalidServiceGroupException {
-    	ServiceGroup serviceGroup = this.getServiceGroup(name);
-    	if (serviceGroup == null) {
-    		throw new InvalidServiceGroupException("Invalid ServiceGroup " + serviceGroup);
-    	}
-    	String [] cs = serviceGroup.getCartridges();
-    	return cs;
-    	
+    public String[] getServiceGroupCartridges(String name) throws InvalidServiceGroupException {
+        ServiceGroup serviceGroup = this.getServiceGroup(name);
+        if (serviceGroup == null) {
+            throw new InvalidServiceGroupException("Invalid ServiceGroup " + serviceGroup);
+        }
+        String[] cs = serviceGroup.getCartridges();
+        return cs;
+
     }
-    
-    public Dependencies getServiceGroupDependencies (String name) throws InvalidServiceGroupException {
-    	ServiceGroup serviceGroup = this.getServiceGroup(name);
-    	if (serviceGroup == null) {
-    		throw new InvalidServiceGroupException("Invalid ServiceGroup " + serviceGroup);
-    	}
-    	return serviceGroup.getDependencies();
+
+    public Dependencies getServiceGroupDependencies(String name) throws InvalidServiceGroupException {
+        ServiceGroup serviceGroup = this.getServiceGroup(name);
+        if (serviceGroup == null) {
+            throw new InvalidServiceGroupException("Invalid ServiceGroup " + serviceGroup);
+        }
+        return serviceGroup.getDependencies();
     }
 
     @Override
     public MemberContext startInstance(MemberContext memberContext) throws
-        UnregisteredCartridgeException, InvalidIaasProviderException {
+            UnregisteredCartridgeException, InvalidIaasProviderException {
 
-    	if(LOG.isDebugEnabled()) {
-    		LOG.debug("CloudControllerServiceImpl:startInstance");
-    	}
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("CloudControllerServiceImpl:startInstance");
+        }
 
-    	handleNullObject(memberContext, "Instance start-up failed. Member is null.");
+        handleNullObject(memberContext, "Instance start-up failed. Member is null.");
 
         String clusterId = memberContext.getClusterId();
         Partition partition = memberContext.getPartition();
 
-        if(LOG.isDebugEnabled()) {
-        	LOG.debug("Received an instance spawn request : " + memberContext);
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("Received an instance spawn request : " + memberContext);
         }
 
         Template template = null;
 
         handleNullObject(partition, "Instance start-up failed. Specified Partition is null. " +
-                                 memberContext);
+                memberContext);
 
         String partitionId = partition.getId();
         ClusterContext ctxt = dataHolder.getClusterContext(clusterId);
@@ -415,8 +414,8 @@ public class CloudControllerServiceImpl implements CloudControllerService {
 
         if (cartridge == null) {
             String msg =
-                         "Instance start-up failed. No matching Cartridge found [type] "+cartridgeType +". "+
-                                 memberContext.toString();
+                    "Instance start-up failed. No matching Cartridge found [type] " + cartridgeType + ". " +
+                            memberContext.toString();
             LOG.error(msg);
             throw new UnregisteredCartridgeException(msg);
         }
@@ -426,20 +425,20 @@ public class CloudControllerServiceImpl implements CloudControllerService {
 
         IaasProvider iaasProvider = cartridge.getIaasProviderOfPartition(partitionId);
         if (iaasProvider == null) {
-        	if (LOG.isDebugEnabled()) {
-        		LOG.debug("IaasToPartitionMap "+cartridge.hashCode()
-        				+ " for cartridge "+cartridgeType+ " and for partition: "+partitionId);
-        	}
-			String msg = "Instance start-up failed. "
-					+ "There's no IaaS provided for the partition: "
-					+ partitionId
-					+ " and for the Cartridge type: "
-					+ cartridgeType
-					+ ". Only following "
-					+ "partitions can be found in this Cartridge: "
-					+ cartridge.getPartitionToIaasProvider().keySet()
-							.toString() + ". " + memberContext.toString()
-					+ ". ";
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("IaasToPartitionMap " + cartridge.hashCode()
+                        + " for cartridge " + cartridgeType + " and for partition: " + partitionId);
+            }
+            String msg = "Instance start-up failed. "
+                    + "There's no IaaS provided for the partition: "
+                    + partitionId
+                    + " and for the Cartridge type: "
+                    + cartridgeType
+                    + ". Only following "
+                    + "partitions can be found in this Cartridge: "
+                    + cartridge.getPartitionToIaasProvider().keySet()
+                    .toString() + ". " + memberContext.toString()
+                    + ". ";
             LOG.fatal(msg);
             throw new InvalidIaasProviderException(msg);
         }
@@ -454,8 +453,8 @@ public class CloudControllerServiceImpl implements CloudControllerService {
             addToPayload(payload, "LB_CLUSTER_ID", memberContext.getLbClusterId());
             addToPayload(payload, "NETWORK_PARTITION_ID", memberContext.getNetworkPartitionId());
             addToPayload(payload, "PARTITION_ID", partitionId);
-            if(memberContext.getProperties() != null) {
-            	org.apache.stratos.common.Properties properties = memberContext.getProperties();
+            if (memberContext.getProperties() != null) {
+                org.apache.stratos.common.Properties properties = memberContext.getProperties();
                 if (properties != null) {
                     for (Property prop : properties.getProperties()) {
                         addToPayload(payload, prop.getName(), prop.getValue());
@@ -464,27 +463,27 @@ public class CloudControllerServiceImpl implements CloudControllerService {
             }
 
             Iaas iaas = iaasProvider.getIaas();
-            
+
             if (LOG.isDebugEnabled()) {
                 LOG.debug("Payload: " + payload.toString());
             }
-            
+
             if (iaas == null) {
-                if(LOG.isDebugEnabled()) {
-                    LOG.debug("Iaas is null of Iaas Provider: "+type+". Trying to build IaaS...");
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug("Iaas is null of Iaas Provider: " + type + ". Trying to build IaaS...");
                 }
                 try {
                     iaas = CloudControllerUtil.getIaas(iaasProvider);
                 } catch (InvalidIaasProviderException e) {
-                    String msg ="Instance start up failed. "+memberContext.toString()+
-                            "Unable to build Iaas of this IaasProvider [Provider] : " + type+". Cause: "+e.getMessage();
+                    String msg = "Instance start up failed. " + memberContext.toString() +
+                            "Unable to build Iaas of this IaasProvider [Provider] : " + type + ". Cause: " + e.getMessage();
                     LOG.error(msg, e);
                     throw new InvalidIaasProviderException(msg, e);
                 }
-                
+
             }
 
-            if(ctxt.isVolumeRequired()) {
+            if (ctxt.isVolumeRequired()) {
                 if (ctxt.getVolumes() != null) {
                     for (Volume volume : ctxt.getVolumes()) {
 
@@ -496,19 +495,19 @@ public class CloudControllerServiceImpl implements CloudControllerService {
                 }
             }
 
-            if(ctxt.isVolumeRequired()){
+            if (ctxt.isVolumeRequired()) {
                 addToPayload(payload, "PERSISTENCE_MAPPING", getPersistencePayload(ctxt, iaas).toString());
             }
             iaasProvider.setPayload(payload.toString().getBytes());
             iaas.setDynamicPayload();
 
             template = iaasProvider.getTemplate();
-                        
+
             if (template == null) {
                 String msg =
-                             "Failed to start an instance. " +
-                                     memberContext.toString() +
-                                     ". Reason : Jclouds Template is null for iaas provider [type]: "+iaasProvider.getType();
+                        "Failed to start an instance. " +
+                                memberContext.toString() +
+                                ". Reason : Jclouds Template is null for iaas provider [type]: " + iaasProvider.getType();
                 LOG.error(msg);
                 throw new InvalidIaasProviderException(msg);
             }
@@ -516,115 +515,114 @@ public class CloudControllerServiceImpl implements CloudControllerService {
             //Start instance start up in a new thread
             ThreadExecutor exec = ThreadExecutor.getInstance();
             if (LOG.isDebugEnabled()) {
-            	LOG.debug("Cloud Controller is starting the instance start up thread.");
-			}
+                LOG.debug("Cloud Controller is starting the instance start up thread.");
+            }
             exec.execute(new JcloudsInstanceCreator(memberContext, iaasProvider, cartridgeType));
 
-            LOG.info("Instance is successfully starting up. "+memberContext.toString());
+            LOG.info("Instance is successfully starting up. " + memberContext.toString());
 
             return memberContext;
 
         } catch (Exception e) {
-            String msg = "Failed to start an instance. " + memberContext.toString()+" Cause: "+e.getMessage();
+            String msg = "Failed to start an instance. " + memberContext.toString() + " Cause: " + e.getMessage();
             LOG.error(msg, e);
             throw new IllegalStateException(msg, e);
         }
 
     }
 
-	private void createVolumeAndSetInClusterContext(Volume volume,
-			IaasProvider iaasProvider) {
-		// iaas cannot be null at this state #startInstance method
-		Iaas iaas = iaasProvider.getIaas();
-		int sizeGB = volume.getSize();
-		String snapshotId =  volume.getSnapshotId();
-        if(StringUtils.isNotEmpty(volume.getVolumeId())){
+    private void createVolumeAndSetInClusterContext(Volume volume,
+                                                    IaasProvider iaasProvider) {
+        // iaas cannot be null at this state #startInstance method
+        Iaas iaas = iaasProvider.getIaas();
+        int sizeGB = volume.getSize();
+        String snapshotId = volume.getSnapshotId();
+        if (StringUtils.isNotEmpty(volume.getVolumeId())) {
             // volumeID is specified, so not creating additional volumes
-            if(LOG.isDebugEnabled()){
+            if (LOG.isDebugEnabled()) {
                 LOG.debug("Volume creation is skipping since a volume ID is specified. [Volume ID]" + volume.getVolumeId());
             }
             volume.setId(volume.getVolumeId());
-        }else{
+        } else {
             String volumeId = iaas.createVolume(sizeGB, snapshotId);
             volume.setId(volumeId);
         }
-        
-		volume.setIaasType(iaasProvider.getType());
-	}
+
+        volume.setIaasType(iaasProvider.getType());
+    }
 
 
     private StringBuilder getPersistencePayload(ClusterContext ctx, Iaas iaas) {
-		StringBuilder persistencePayload = new StringBuilder();
-		if(isPersistenceMappingAvailable(ctx)){
-			for(Volume volume : ctx.getVolumes()){
-				if(LOG.isDebugEnabled()){
-					LOG.debug("Adding persistence mapping " + volume.toString());
-				}
-                if(persistencePayload.length() != 0) {
-                   persistencePayload.append("|");
+        StringBuilder persistencePayload = new StringBuilder();
+        if (isPersistenceMappingAvailable(ctx)) {
+            for (Volume volume : ctx.getVolumes()) {
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug("Adding persistence mapping " + volume.toString());
+                }
+                if (persistencePayload.length() != 0) {
+                    persistencePayload.append("|");
                 }
-                
-				persistencePayload.append(iaas.getIaasDevice(volume.getDevice()));
-				persistencePayload.append("|");
+
+                persistencePayload.append(iaas.getIaasDevice(volume.getDevice()));
+                persistencePayload.append("|");
                 persistencePayload.append(volume.getId());
                 persistencePayload.append("|");
                 persistencePayload.append(volume.getMappingPath());
-			}
-		}
-        if(LOG.isDebugEnabled()){
+            }
+        }
+        if (LOG.isDebugEnabled()) {
             LOG.debug("Persistence payload is" + persistencePayload.toString());
         }
-		return persistencePayload;
-	}
+        return persistencePayload;
+    }
 
-	private boolean isPersistenceMappingAvailable(ClusterContext ctx) {
-		return ctx.getVolumes() != null && ctx.isVolumeRequired();
-	}
+    private boolean isPersistenceMappingAvailable(ClusterContext ctx) {
+        return ctx.getVolumes() != null && ctx.isVolumeRequired();
+    }
 
-	private void addToPayload(StringBuilder payload, String name, String value) {
-	    payload.append(",");
-        payload.append(name+"=" + value);
+    private void addToPayload(StringBuilder payload, String name, String value) {
+        payload.append(",");
+        payload.append(name + "=" + value);
     }
 
     /**
-	 * Persist data in registry.
-	 */
-	private void persist() {
-		try {
-			RegistryManager.getInstance().persist(
-					dataHolder);
-		} catch (RegistryException e) {
-
-			String msg = "Failed to persist the Cloud Controller data in registry. Further, transaction roll back also failed.";
-			LOG.fatal(msg);
-			throw new CloudControllerException(msg, e);
-		}
-	}
+     * Persist data in registry.
+     */
+    private void persist() {
+        try {
+            RegistryManager.getInstance().persist(
+                    dataHolder);
+        } catch (RegistryException e) {
+
+            String msg = "Failed to persist the Cloud Controller data in registry. Further, transaction roll back also failed.";
+            LOG.fatal(msg);
+            throw new CloudControllerException(msg, e);
+        }
+    }
 
     private String generateMemberId(String clusterId) {
         UUID memberId = UUID.randomUUID();
-         return clusterId + memberId.toString();
+        return clusterId + memberId.toString();
     }
 
     @Override
-    public void terminateInstance(String memberId) throws InvalidMemberException, InvalidCartridgeTypeException 
-    {
+    public void terminateInstance(String memberId) throws InvalidMemberException, InvalidCartridgeTypeException {
 
         handleNullObject(memberId, "Termination failed. Null member id.");
-        
+
         MemberContext ctxt = dataHolder.getMemberContextOfMemberId(memberId);
-        
-        if(ctxt == null) {
-            String msg = "Termination failed. Invalid Member Id: "+memberId;
+
+        if (ctxt == null) {
+            String msg = "Termination failed. Invalid Member Id: " + memberId;
             LOG.error(msg);
             throw new InvalidMemberException(msg);
         }
-        
+
         ThreadExecutor exec = ThreadExecutor.getInstance();
         exec.execute(new InstanceTerminator(ctxt));
 
-	}
-    
+    }
+
     private class InstanceTerminator implements Runnable {
 
         private MemberContext ctxt;
@@ -647,14 +645,14 @@ public class CloudControllerServiceImpl implements CloudControllerService {
                 Cartridge cartridge = dataHolder.getCartridge(cartridgeType);
 
                 LOG.info("Starting to terminate an instance with member id : " + memberId +
-                         " in partition id: " + partitionId + " of cluster id: " + clusterId +
-                         " and of cartridge type: " + cartridgeType);
+                        " in partition id: " + partitionId + " of cluster id: " + clusterId +
+                        " and of cartridge type: " + cartridgeType);
 
                 if (cartridge == null) {
                     String msg =
-                                 "Termination of Member Id: " + memberId + " failed. " +
-                                         "Cannot find a matching Cartridge for type: " +
-                                         cartridgeType;
+                            "Termination of Member Id: " + memberId + " failed. " +
+                                    "Cannot find a matching Cartridge for type: " +
+                                    cartridgeType;
                     LOG.error(msg);
                     throw new InvalidCartridgeTypeException(msg);
                 }
@@ -663,8 +661,8 @@ public class CloudControllerServiceImpl implements CloudControllerService {
                 if (nodeId == null) {
 
                     String msg =
-                                 "Termination failed. Cannot find a node id for Member Id: " +
-                                         memberId;
+                            "Termination failed. Cannot find a node id for Member Id: " +
+                                    memberId;
 
                     // log information
                     logTermination(ctxt);
@@ -682,7 +680,7 @@ public class CloudControllerServiceImpl implements CloudControllerService {
 
             } catch (Exception e) {
                 String msg =
-                             "Instance termination failed. "+ctxt.toString();
+                        "Instance termination failed. " + ctxt.toString();
                 LOG.error(msg, e);
                 throw new CloudControllerException(msg, e);
             }
@@ -696,8 +694,8 @@ public class CloudControllerServiceImpl implements CloudControllerService {
         private IaasProvider iaasProvider;
         private String cartridgeType;
 
-        public JcloudsInstanceCreator(MemberContext memberContext, IaasProvider iaasProvider, 
-        		String cartridgeType) {
+        public JcloudsInstanceCreator(MemberContext memberContext, IaasProvider iaasProvider,
+                                      String cartridgeType) {
             this.memberContext = memberContext;
             this.iaasProvider = iaasProvider;
             this.cartridgeType = cartridgeType;
@@ -712,379 +710,380 @@ public class CloudControllerServiceImpl implements CloudControllerService {
             ClusterContext ctxt = dataHolder.getClusterContext(clusterId);
             Iaas iaas = iaasProvider.getIaas();
             String publicIp = null;
-            
+
             NodeMetadata node = null;
             // generate the group id from domain name and sub domain name.
             // Should have lower-case ASCII letters, numbers, or dashes.
             // Should have a length between 3-15
             String str = clusterId.length() > 10 ? clusterId.substring(0, 10) : clusterId.substring(0, clusterId.length());
             String group = str.replaceAll("[^a-z0-9-]", "");
-            
+
             try {
-            	ComputeService computeService = iaasProvider
-            			.getComputeService();
-            	Template template = iaasProvider.getTemplate();
-            	
-            	if (LOG.isDebugEnabled()) {
-            		LOG.debug("Cloud Controller is delegating request to start an instance for "
-            				+ memberContext + " to Jclouds layer.");
-            	}
-            	// create and start a node
-            	Set<? extends NodeMetadata> nodes = computeService
-            			.createNodesInGroup(group, 1, template);
-            	node = nodes.iterator().next();
-            	if (LOG.isDebugEnabled()) {
-            		LOG.debug("Cloud Controller received a response for the request to start "
-            				+ memberContext + " from Jclouds layer.");
-            	}
-            	
-            	if (node == null) {
-            	    String msg = "Null response received for instance start-up request to Jclouds.\n"
+                ComputeService computeService = iaasProvider
+                        .getComputeService();
+                Template template = iaasProvider.getTemplate();
+
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug("Cloud Controller is delegating request to start an instance for "
+                            + memberContext + " to Jclouds layer.");
+                }
+                // create and start a node
+                Set<? extends NodeMetadata> nodes = computeService
+                        .createNodesInGroup(group, 1, template);
+                node = nodes.iterator().next();
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug("Cloud Controller received a response for the request to start "
+                            + memberContext + " from Jclouds layer.");
+                }
+
+                if (node == null) {
+                    String msg = "Null response received for instance start-up request to Jclouds.\n"
                             + memberContext.toString();
                     LOG.error(msg);
                     throw new IllegalStateException(msg);
-            	}
-            	
-            	// node id
-            	String nodeId = node.getId();
-            	if (nodeId == null) {
-            		String msg = "Node id of the starting instance is null.\n"
-            				+ memberContext.toString();
-            		LOG.fatal(msg);
-            		throw new IllegalStateException(msg);
-            	}
-            	
-            	memberContext.setNodeId(nodeId);
-            	if (LOG.isDebugEnabled()) {
-            		LOG.debug("Node id was set. " + memberContext.toString());
-            	}
-            	
-            	// attach volumes
-            	if (ctxt.isVolumeRequired()) {
-            		// remove region prefix
-            		String instanceId = nodeId.indexOf('/') != -1 ? nodeId
-            				.substring(nodeId.indexOf('/') + 1, nodeId.length())
-            				: nodeId;
-            				memberContext.setInstanceId(instanceId);
-            				if (ctxt.getVolumes() != null) {
-            					for (Volume volume : ctxt.getVolumes()) {
-            						try {
-            							iaas.attachVolume(instanceId, volume.getId(),
-            									volume.getDevice());
-            						} catch (Exception e) {
-            							// continue without throwing an exception, since
-            							// there is an instance already running
-            							LOG.error("Attaching Volume to Instance [ "
-            									+ instanceId + " ] failed!", e);
-            						}
-            					}
-            				}
-            	}
-            	
+                }
+
+                // node id
+                String nodeId = node.getId();
+                if (nodeId == null) {
+                    String msg = "Node id of the starting instance is null.\n"
+                            + memberContext.toString();
+                    LOG.fatal(msg);
+                    throw new IllegalStateException(msg);
+                }
+
+                memberContext.setNodeId(nodeId);
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug("Node id was set. " + memberContext.toString());
+                }
+
+                // attach volumes
+                if (ctxt.isVolumeRequired()) {
+                    // remove region prefix
+                    String instanceId = nodeId.indexOf('/') != -1 ? nodeId
+                            .substring(nodeId.indexOf('/') + 1, nodeId.length())
+                            : nodeId;
+                    memberContext.setInstanceId(instanceId);
+                    if (ctxt.getVolumes() != null) {
+                        for (Volume volume : ctxt.getVolumes()) {
+                            try {
+                                iaas.attachVolume(instanceId, volume.getId(),
+                                        volume.getDevice());
+                            } catch (Exception e) {
+                                // continue without throwing an exception, since
+                                // there is an instance already running
+                                LOG.error("Attaching Volume to Instance [ "
+                                        + instanceId + " ] failed!", e);
+                            }
+                        }
+                    }
+                }
+
             } catch (Exception e) {
-            	String msg = "Failed to start an instance. " + memberContext.toString()+" Cause: "+e.getMessage();
-            	LOG.error(msg, e);
-            	throw new IllegalStateException(msg, e);
+                String msg = "Failed to start an instance. " + memberContext.toString() + " Cause: " + e.getMessage();
+                LOG.error(msg, e);
+                throw new IllegalStateException(msg, e);
             }
 
-            try{
-            	if (LOG.isDebugEnabled()) {
-    				LOG.debug("IP allocation process started for "+memberContext);
-    			}
+            try {
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug("IP allocation process started for " + memberContext);
+                }
                 String autoAssignIpProp =
-                                          iaasProvider.getProperty(CloudControllerConstants.AUTO_ASSIGN_IP_PROPERTY);
-                
+                        iaasProvider.getProperty(CloudControllerConstants.AUTO_ASSIGN_IP_PROPERTY);
+
                 String pre_defined_ip =
                         iaasProvider.getProperty(CloudControllerConstants.FLOATING_IP_PROPERTY);
-                    
-	                // reset ip
-	                String ip = "";
-                    
-                    // default behavior is autoIpAssign=false
-                    if (autoAssignIpProp == null ||
+
+                // reset ip
+                String ip = "";
+
+                // default behavior is autoIpAssign=false
+                if (autoAssignIpProp == null ||
                         (autoAssignIpProp != null && autoAssignIpProp.equals("false"))) {
-                    	
-                    	// check if floating ip is well defined in cartridge definition
-                    	if (pre_defined_ip != null) {
-                    		if (isValidIpAddress(pre_defined_ip)) {
-                    			if(LOG.isDebugEnabled()) {
-                    				LOG.debug("CloudControllerServiceImpl:IpAllocator:pre_defined_ip: invoking associatePredefinedAddress" + pre_defined_ip);
-                    			}
-	    	                	ip = iaas.associatePredefinedAddress(node, pre_defined_ip);
-	    	       
-	    	                	if (ip == null || "".equals(ip) || !pre_defined_ip.equals(ip)) {
-	    	                		// throw exception and stop instance creation
-	       	                		String msg = "Error occurred while allocating predefined floating ip address: " + pre_defined_ip + 
-	       	                					 " / allocated ip:" + ip + 
-	       	                				     " - terminating node:"  + memberContext.toString();
-	    	                        LOG.error(msg);
-	    	                		// terminate instance
-	    	                        terminate(iaasProvider, 
-	    	                    			node.getId(), memberContext);
-	    	                        throw new CloudControllerException(msg);
-	    	                	}
-                    		} else {
-                    			String msg = "Invalid floating ip address configured: " + pre_defined_ip +  
-  	                				     " - terminating node:"  + memberContext.toString();
-                    			LOG.error(msg);
-                    			// terminate instance
-                    			terminate(iaasProvider, 
-	                    			node.getId(), memberContext);
-                    			throw new CloudControllerException(msg);
-                    		}
-	    	                	
+
+                    // check if floating ip is well defined in cartridge definition
+                    if (pre_defined_ip != null) {
+                        if (isValidIpAddress(pre_defined_ip)) {
+                            if (LOG.isDebugEnabled()) {
+                                LOG.debug("CloudControllerServiceImpl:IpAllocator:pre_defined_ip: invoking associatePredefinedAddress" + pre_defined_ip);
+                            }
+                            ip = iaas.associatePredefinedAddress(node, pre_defined_ip);
+
+                            if (ip == null || "".equals(ip) || !pre_defined_ip.equals(ip)) {
+                                // throw exception and stop instance creation
+                                String msg = "Error occurred while allocating predefined floating ip address: " + pre_defined_ip +
+                                        " / allocated ip:" + ip +
+                                        " - terminating node:" + memberContext.toString();
+                                LOG.error(msg);
+                                // terminate instance
+                                terminate(iaasProvider,
+                                        node.getId(), memberContext);
+                                throw new CloudControllerException(msg);
+                            }
                         } else {
-                        	if(LOG.isDebugEnabled()) {
-                        		LOG.debug("CloudControllerServiceImpl:IpAllocator:no (valid) predefined floating ip configured, "
-                        		        + "selecting available one from pool");
-                        	}
-                            // allocate an IP address - manual IP assigning mode
-                            ip = iaas.associateAddress(node);
-                            
-    						if (ip != null) {
-    							memberContext.setAllocatedIpAddress(ip);
-    							LOG.info("Allocated an ip address: "
-    									+ memberContext.toString());
-    						}
-                        }       
-                    	
-                    	if (ip == null) {
-                    	    String msg = "No IP address found. IP allocation failed for "+memberContext;
-                    	    LOG.error(msg);
+                            String msg = "Invalid floating ip address configured: " + pre_defined_ip +
+                                    " - terminating node:" + memberContext.toString();
+                            LOG.error(msg);
+                            // terminate instance
+                            terminate(iaasProvider,
+                                    node.getId(), memberContext);
                             throw new CloudControllerException(msg);
-                    	}
-                    	
-                    	// build the node with the new ip
-                    	node = NodeMetadataBuilder.fromNodeMetadata(node)
-                				.publicAddresses(ImmutableSet.of(ip)).build();
-                    } 
-                    
-
-                    // public ip
-                    if (node.getPublicAddresses() != null &&
-                        node.getPublicAddresses().iterator().hasNext()) {
-                        ip = node.getPublicAddresses().iterator().next();
-                        publicIp = ip;
-                        memberContext.setPublicIpAddress(ip);
-                        LOG.info("Retrieving Public IP Address : " + memberContext.toString());
+                        }
+
+                    } else {
+                        if (LOG.isDebugEnabled()) {
+                            LOG.debug("CloudControllerServiceImpl:IpAllocator:no (valid) predefined floating ip configured, "
+                                    + "selecting available one from pool");
+                        }
+                        // allocate an IP address - manual IP assigning mode
+                        ip = iaas.associateAddress(node);
+
+                        if (ip != null) {
+                            memberContext.setAllocatedIpAddress(ip);
+                            LOG.info("Allocated an ip address: "
+                                    + memberContext.toString());
+                        }
                     }
 
-                    // private IP
-                    if (node.getPrivateAddresses() != null &&
-                        node.getPrivateAddresses().iterator().hasNext()) {
-                        ip = node.getPrivateAddresses().iterator().next();
-                        memberContext.setPrivateIpAddress(ip);
-                        LOG.info("Retrieving Private IP Address. " + memberContext.toString());
+                    if (ip == null) {
+                        String msg = "No IP address found. IP allocation failed for " + memberContext;
+                        LOG.error(msg);
+                        throw new CloudControllerException(msg);
                     }
 
-                    dataHolder.addMemberContext(memberContext);
+                    // build the node with the new ip
+                    node = NodeMetadataBuilder.fromNodeMetadata(node)
+                            .publicAddresses(ImmutableSet.of(ip)).build();
+                }
 
-                    // persist in registry
-                    persist();
 
+                // public ip
+                if (node.getPublicAddresses() != null &&
+                        node.getPublicAddresses().iterator().hasNext()) {
+                    ip = node.getPublicAddresses().iterator().next();
+                    publicIp = ip;
+                    memberContext.setPublicIpAddress(ip);
+                    LOG.info("Retrieving Public IP Address : " + memberContext.toString());
+                }
 
-                    // trigger topology
-                    TopologyBuilder.handleMemberSpawned(cartridgeType, clusterId, 
-                    		partition.getId(), ip, publicIp, memberContext);
-                    
-                    String memberID = memberContext.getMemberId();
+                // private IP
+                if (node.getPrivateAddresses() != null &&
+                        node.getPrivateAddresses().iterator().hasNext()) {
+                    ip = node.getPrivateAddresses().iterator().next();
+                    memberContext.setPrivateIpAddress(ip);
+                    LOG.info("Retrieving Private IP Address. " + memberContext.toString());
+                }
 
-                    // 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);
-        			}
+                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);
-            } 
+            }
 
 
         }
     }
-    
-    private boolean isValidIpAddress (String ip) {
-    	boolean isValid = InetAddresses.isInetAddress(ip);
-    	return isValid;
+
+    private boolean isValidIpAddress(String ip) {
+        boolean isValid = InetAddresses.isInetAddress(ip);
+        return isValid;
     }
 
-	@Override
-	public void terminateAllInstances(String clusterId) throws InvalidClusterException {
+    @Override
+    public void terminateAllInstances(String clusterId) throws InvalidClusterException {
+
+        LOG.info("Starting to terminate all instances of cluster : "
+                + clusterId);
 
-		LOG.info("Starting to terminate all instances of cluster : "
-				+ clusterId);
-		
-		handleNullObject(clusterId, "Instance termination failed. Cluster id is null.");
-		
-		List<MemberContext> ctxts = dataHolder.getMemberContextsOfClusterId(clusterId);
-		
-		if(ctxts == null) {
-		    String msg = "Instance termination failed. No members found for cluster id: "+clusterId;
-		    LOG.warn(msg);
+        handleNullObject(clusterId, "Instance termination failed. Cluster id is null.");
+
+        List<MemberContext> ctxts = dataHolder.getMemberContextsOfClusterId(clusterId);
+
+        if (ctxts == null) {
+            String msg = "Instance termination failed. No members found for cluster id: " + clusterId;
+            LOG.warn(msg);
             return;
-		}
-		
-		ThreadExecutor exec = ThreadExecutor.getInstance();
-		for (MemberContext memberContext : ctxts) {
+        }
+
+        ThreadExecutor exec = ThreadExecutor.getInstance();
+        for (MemberContext memberContext : ctxts) {
             exec.execute(new InstanceTerminator(memberContext));
         }
 
-	}
+    }
 
 
-	/**
-	 * A helper method to terminate an instance.
+    /**
+     * A helper method to terminate an instance.
+     *
      * @param iaasProvider
      * @param ctxt
      * @param nodeId
      * @return will return the IaaSProvider
      */
-	private IaasProvider terminate(IaasProvider iaasProvider, 
-			String nodeId, MemberContext ctxt) {
-	    Iaas iaas = iaasProvider.getIaas();
-	    if (iaas == null) {
-	        
-	        try {
-	            iaas = CloudControllerUtil.getIaas(iaasProvider);
-	        } catch (InvalidIaasProviderException e) {
-	            String msg =
-	                    "Instance termination failed. " +ctxt.toString()  +
-	                    ". Cause: Unable to build Iaas of this " + iaasProvider.toString();
-	            LOG.error(msg, e);
-	            throw new CloudControllerException(msg, e);
-	        }
-	        
-	    }
-	    
-	    //detach volumes if any
-	    detachVolume(iaasProvider, ctxt);
-	    
-		// destroy the node
-		iaasProvider.getComputeService().destroyNode(nodeId);
-
-		// release allocated IP address
-		if (ctxt.getAllocatedIpAddress() != null) {
+    private IaasProvider terminate(IaasProvider iaasProvider,
+                                   String nodeId, MemberContext ctxt) {
+        Iaas iaas = iaasProvider.getIaas();
+        if (iaas == null) {
+
+            try {
+                iaas = CloudControllerUtil.getIaas(iaasProvider);
+            } catch (InvalidIaasProviderException e) {
+                String msg =
+                        "Instance termination failed. " + ctxt.toString() +
+                                ". Cause: Unable to build Iaas of this " + iaasProvider.toString();
+                LOG.error(msg, e);
+                throw new CloudControllerException(msg, e);
+            }
+
+        }
+
+        //detach volumes if any
+        detachVolume(iaasProvider, ctxt);
+
+        // destroy the node
+        iaasProvider.getComputeService().destroyNode(nodeId);
+
+        // release allocated IP address
+        if (ctxt.getAllocatedIpAddress() != null) {
             iaas.releaseAddress(ctxt.getAllocatedIpAddress());
-		}
-		
-		LOG.info("Member is terminated: "+ctxt.toString());
-		return iaasProvider;
-	}
-
-	private void detachVolume(IaasProvider iaasProvider, MemberContext ctxt) {
-		String clusterId = ctxt.getClusterId();
-		ClusterContext clusterCtxt = dataHolder.getClusterContext(clusterId);
-		if (clusterCtxt.getVolumes() != null) {
-			for (Volume volume : clusterCtxt.getVolumes()) {
-				try {
-					String volumeId = volume.getId();
-					if (volumeId == null) {
-						return;
-					}
-					Iaas iaas = iaasProvider.getIaas();
-					iaas.detachVolume(ctxt.getInstanceId(), volumeId);
-				} catch (ResourceNotFoundException ignore) {
-					if(LOG.isDebugEnabled()) {
-						LOG.debug(ignore);
-					}
-				}
-			}
-		}
-	}
-
-	private void logTermination(MemberContext memberContext) {
-
-	    if (memberContext == null) {
-	        return;
-	    }
-	    
-	    String partitionId = memberContext.getPartition() == null ? null : memberContext.getPartition().getId();
-	    
+        }
+
+        LOG.info("Member is terminated: " + ctxt.toString());
+        return iaasProvider;
+    }
+
+    private void detachVolume(IaasProvider iaasProvider, MemberContext ctxt) {
+        String clusterId = ctxt.getClusterId();
+        ClusterContext clusterCtxt = dataHolder.getClusterContext(clusterId);
+        if (clusterCtxt.getVolumes() != null) {
+            for (Volume volume : clusterCtxt.getVolumes()) {
+                try {
+                    String volumeId = volume.getId();
+                    if (volumeId == null) {
+                        return;
+                    }
+                    Iaas iaas = iaasProvider.getIaas();
+                    iaas.detachVolume(ctxt.getInstanceId(), volumeId);
+                } catch (ResourceNotFoundException ignore) {
+                    if (LOG.isDebugEnabled()) {
+                        LOG.debug(ignore);
+                    }
+                }
+            }
+        }
+    }
+
+    private void logTermination(MemberContext memberContext) {
+
+        if (memberContext == null) {
+            return;
+        }
+
+        String partitionId = memberContext.getPartition() == null ? null : memberContext.getPartition().getId();
+
         //updating the topology
-        TopologyBuilder.handleMemberTerminated(memberContext.getCartridgeType(), 
-        		memberContext.getClusterId(), memberContext.getNetworkPartitionId(), 
-        		partitionId, memberContext.getMemberId());
+        TopologyBuilder.handleMemberTerminated(memberContext.getCartridgeType(),
+                memberContext.getClusterId(), memberContext.getNetworkPartitionId(),
+                partitionId, memberContext.getMemberId());
 
         //publishing data
         CartridgeInstanceDataPublisher.publish(memberContext.getMemberId(),
-                                                        partitionId,
-                                                        memberContext.getNetworkPartitionId(),
-                                                        memberContext.getClusterId(),
-                                                        memberContext.getCartridgeType(),
-                                                        MemberStatus.Terminated.toString(),
-                                                        null);
+                partitionId,
+                memberContext.getNetworkPartitionId(),
+                memberContext.getClusterId(),
+                memberContext.getCartridgeType(),
+                MemberStatus.Terminated.toString(),
+                null);
 
         // update data holders
         dataHolder.removeMemberContext(memberContext.getMemberId(), memberContext.getClusterId());
-        
-		// persist
-		persist();
-
-	}
-
-	@Override
-	public boolean registerService(Registrant registrant)
-			throws UnregisteredCartridgeException {
-
-	    String cartridgeType = registrant.getCartridgeType();
-	    handleNullObject(cartridgeType, "Service registration failed. Cartridge Type is null.");
-	    
-	    String clusterId = registrant.getClusterId();
-	    handleNullObject(clusterId, "Service registration failed. Cluster id is null.");
-	    
+
+        // persist
+        persist();
+
+    }
+
+    @Override
+    public boolean registerService(Registrant registrant)
+            throws UnregisteredCartridgeException {
+
+        String cartridgeType = registrant.getCartridgeType();
+        handleNullObject(cartridgeType, "Service registration failed. Cartridge Type is null.");
+
+        String clusterId = registrant.getClusterId();
+        handleNullObject(clusterId, "Service registration failed. Cluster id is null.");
+
         String payload = registrant.getPayload();
         handleNullObject(payload, "Service registration failed. Payload is null.");
-        
+
         String hostName = registrant.getHostName();
         handleNullObject(hostName, "Service registration failed. Hostname is null.");
-        
+
         Cartridge cartridge = null;
         if ((cartridge = dataHolder.getCartridge(cartridgeType)) == null) {
 
-            String msg = "Registration of cluster: "+clusterId+
+            String msg = "Registration of cluster: " + clusterId +
                     " failed. - Unregistered Cartridge type: " + cartridgeType;
             LOG.error(msg);
             throw new UnregisteredCartridgeException(msg);
         }
-        
+
         Properties props = CloudControllerUtil.toJavaUtilProperties(registrant.getProperties());
         String property = props.getProperty(Constants.IS_LOAD_BALANCER);
         boolean isLb = property != null ? Boolean.parseBoolean(property) : false;
 
         ClusterContext ctxt = null;//TODO buildClusterContext(cartridge, clusterId,
-				//payload, hostName, props, isLb, registrant.getPersistence());
+        //payload, hostName, props, isLb, registrant.getPersistence());
 
 
-		dataHolder.addClusterContext(ctxt);
-	    TopologyBuilder.handleClusterCreated(registrant, isLb);
-	    
-	    persist();
-	    
-	    LOG.info("Successfully registered: "+registrant);
-	    
-		return true;
-	}
+        dataHolder.addClusterContext(ctxt);
+        TopologyBuilder.handleClusterCreated(registrant, isLb);
 
-	private ClusterContext buildClusterContext(Cartridge cartridge,
-                                               String clusterId, String payload, String hostName,
-                                               org.apache.stratos.common.Properties props, boolean isLb, Persistence persistence) {
+        persist();
 
-        //TODO
-		/*// initialize ClusterContext
-		ClusterContext ctxt = new ClusterContext(clusterId, cartridge.getType(), payload, 
+        LOG.info("Successfully registered: " + registrant);
+
+        return true;
+    }
+
+    private ClusterContext buildClusterContext(Cartridge cartridge,
+                                               String clusterId, String payload, String hostName,
+                                               org.apache.stratos.common.Properties props, boolean isLb, Persistence persistence) {
+
+        //TODO
+        /*// initialize ClusterContext
+		ClusterContext ctxt = new ClusterContext(clusterId, cartridge.getType(), payload, 
 				hostName, isLb, props);
 		
 		String property;
@@ -1105,219 +1104,218 @@ public class CloudControllerServiceImpl implements CloudControllerService {
 	    ctxt.setTimeoutInMillis(timeout);
 		return ctxt;*/
         return null;
-	}
+    }
+
+    @Override
+    public String[] getRegisteredCartridges() {
+        // get the list of cartridges registered
+        List<Cartridge> cartridges = dataHolder
+                .getCartridges();
+
+        if (cartridges == null) {
+            LOG.info("No registered Cartridge found.");
+            return new String[0];
+        }
+
+        String[] cartridgeTypes = new String[cartridges.size()];
+        int i = 0;
+
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("Registered Cartridges : \n");
+        }
+        for (Cartridge cartridge : cartridges) {
+            if (LOG.isDebugEnabled()) {
+                LOG.debug(cartridge);
+            }
+            cartridgeTypes[i] = cartridge.getType();
+            i++;
+        }
+
+        return cartridgeTypes;
+    }
 
     @Override
-	public String[] getRegisteredCartridges() {
-		// get the list of cartridges registered
-		List<Cartridge> cartridges = dataHolder
-				.getCartridges();
-
-		if (cartridges == null) {
-		    LOG.info("No registered Cartridge found.");
-			return new String[0];
-		}
-
-		String[] cartridgeTypes = new String[cartridges.size()];
-		int i = 0;
-
-		if (LOG.isDebugEnabled()) {
-		    LOG.debug("Registered Cartridges : \n");
-		}
-		for (Cartridge cartridge : cartridges) {
-		    if (LOG.isDebugEnabled()) {
-		        LOG.debug(cartridge);
-		    }
-			cartridgeTypes[i] = cartridge.getType();
-			i++;
-		}
-
-		return cartridgeTypes;
-	}
-
-	@Override
-	public CartridgeInfo getCartridgeInfo(String cartridgeType)
-			throws UnregisteredCartridgeException {
-		Cartridge cartridge = dataHolder
-				.getCartridge(cartridgeType);
-
-		if (cartridge != null) {
-
-			return CloudControllerUtil.toCartridgeInfo(cartridge);
-
-		}
-
-		String msg = "Cannot find a Cartridge having a type of "
-				+ cartridgeType + ". Hence unable to find information.";
-		LOG.error(msg);
-		throw new UnregisteredCartridgeException(msg);
-	}
+    public CartridgeInfo getCartridgeInfo(String cartridgeType)
+            throws UnregisteredCartridgeException {
+        Cartridge cartridge = dataHolder
+                .getCartridge(cartridgeType);
+
+        if (cartridge != null) {
+
+            return CloudControllerUtil.toCartridgeInfo(cartridge);
+
+        }
+
+        String msg = "Cannot find a Cartridge having a type of "
+                + cartridgeType + ". Hence unable to find information.";
+        LOG.error(msg);
+        throw new UnregisteredCartridgeException(msg);
+    }
 
     @Override
-	public void unregisterService(String clusterId) throws UnregisteredClusterException {
+    public void unregisterService(String clusterId) throws UnregisteredClusterException {
         final String clusterId_ = clusterId;
-        
+
         ClusterContext ctxt = dataHolder.getClusterContext(clusterId_);
 
-        handleNullObject(ctxt, "Service unregistration failed. Invalid cluster id: "+clusterId);
-        
+        handleNullObject(ctxt, "Service unregistration failed. Invalid cluster id: " + clusterId);
+
         String cartridgeType = ctxt.getCartridgeType();
 
         Cartridge cartridge = dataHolder.getCartridge(cartridgeType);
 
         if (cartridge == null) {
             String msg =
-                         "Service unregistration failed. No matching Cartridge found [type] "+cartridgeType +". ";
+                    "Service unregistration failed. No matching Cartridge found [type] " + cartridgeType + ". ";
             LOG.error(msg);
             throw new UnregisteredClusterException(msg);
         }
-        
+
         // if it's a kubernetes cluster
         if (StratosConstants.KUBERNETES_DEPLOYER_TYPE.equals(cartridge.getDeployerType())) {
-        	unregisterDockerService(clusterId_);
-        	
+            unregisterDockerService(clusterId_);
+
         } else {
-        
+
 //	        TopologyBuilder.handleClusterMaintenanceMode(dataHolder.getClusterContext(clusterId_));
-	
-	        Runnable terminateInTimeout = new Runnable() {
-	            @Override
-	            public void run() {
-	                ClusterContext ctxt = dataHolder.getClusterContext(clusterId_);
-	                 if(ctxt == null) {
-	                     String msg = "Service unregistration failed. Cluster not found: " + clusterId_;
-	                     LOG.error(msg);
-	                     return;
-	                 }
-	                 Collection<Member> members = TopologyManager.getTopology().
-	                         getService(ctxt.getCartridgeType()).getCluster(clusterId_).getMembers();
-	                 //finding the responding members from the existing members in the topology.
-	                int sizeOfRespondingMembers = 0;
-	                for(Member member : members) {
-	                    if(member.getStatus().getCode() >= MemberStatus.Activated.getCode()) {
-	                        sizeOfRespondingMembers ++;
-	                    }
-	                }
-	
-	                long endTime = System.currentTimeMillis() + ctxt.getTimeoutInMillis() * sizeOfRespondingMembers;
-	                while(System.currentTimeMillis()< endTime) {
-	                    CloudControllerUtil.sleep(1000);
-	
-	                }
-	
-	                 // if there're still alive members
-	                 if(members.size() > 0) {
-	                     //forcefully terminate them
-	                     for (Member member : members) {
-	
-	                         try {
-	                            terminateInstance(member.getMemberId());
-	                        } catch (Exception e) {
-	                            // we are not gonna stop the execution due to errors.
-	                            LOG.warn("Instance termination failed of member [id] " + member.getMemberId(), e);
-	                        }
-	                    }
-	                 }
-	            }
-	        };
-	        Runnable unregister = new Runnable() {
-	             public void run() {
-	                 ClusterContext ctxt = dataHolder.getClusterContext(clusterId_);
-	                 if(ctxt == null) {
-	                     String msg = "Service unregistration failed. Cluster not found: " + clusterId_;
-	                     LOG.error(msg);
-	                     return;
-	                 }
-	                 Collection<Member> members = TopologyManager.getTopology().
-	                         getService(ctxt.getCartridgeType()).getCluster(clusterId_).getMembers();
-	                 // TODO why end time is needed?
-	                 // long endTime = System.currentTimeMillis() + ctxt.getTimeoutInMillis() * members.size();
-	
-	                 while(members.size() > 0) {
-	                    //waiting until all the members got removed from the Topology/ timed out
-	                    CloudControllerUtil.sleep(1000);
-	                 }
-	
-	                 LOG.info("Unregistration of service cluster: " + clusterId_);
-	                 deleteVolumes(ctxt);
-	                 onClusterRemoval(clusterId_);
-	             }
-	
-	            private void deleteVolumes(ClusterContext ctxt) {
-	                if(ctxt.isVolumeRequired()) {
-	                     Cartridge cartridge = dataHolder.getCartridge(ctxt.getCartridgeType());
-	                     if(cartridge != null && cartridge.getIaases() != null && ctxt.getVolumes() != null) {
-	                         for (Volume volume : ctxt.getVolumes()) {
-	                            if(volume.getId() != null) {
-	                                String iaasType = volume.getIaasType();
-	                                //Iaas iaas = dataHolder.getIaasProvider(iaasType).getIaas();
-	                                Iaas iaas = cartridge.getIaasProvider(iaasType).getIaas();
-	                                if(iaas != null) {
-	                                    try {
-	                                    // delete the volumes if remove on unsubscription is true.
-	                                    if(volume.isRemoveOntermination())
-	                                    {
-	                                        iaas.deleteVolume(volume.getId());
-	                                        volume.setId(null);
-	                                    }
-	                                    } catch(Exception ignore) {
-	                                        if(LOG.isErrorEnabled()) {
-	                                            LOG.error("Error while deleting volume [id] "+ volume.getId(), ignore);
-	                                        }
-	                                    }
-	                                }
-	                            }
-	                        }
-	
-	                     }
-	                 }
-	            }
-	        };
-	        new Thread(terminateInTimeout).start();
-	        new Thread(unregister).start();
-        }
-	}
-    
+
+            Runnable terminateInTimeout = new Runnable() {
+                @Override
+                public void run() {
+                    ClusterContext ctxt = dataHolder.getClusterContext(clusterId_);
+                    if (ctxt == null) {
+                        String msg = "Service unregistration failed. Cluster not found: " + clusterId_;
+                        LOG.error(msg);
+                        return;
+                    }
+                    Collection<Member> members = TopologyManager.getTopology().
+                            getService(ctxt.getCartridgeType()).getCluster(clusterId_).getMembers();
+                    //finding the responding members from the existing members in the topology.
+                    int sizeOfRespondingMembers = 0;
+                    for (Member member : members) {
+                        if (member.getStatus().getCode() >= MemberStatus.Activated.getCode()) {
+                            sizeOfRespondingMembers++;
+                        }
+                    }
+
+                    long endTime = System.currentTimeMillis() + ctxt.getTimeoutInMillis() * sizeOfRespondingMembers;
+                    while (System.currentTimeMillis() < endTime) {
+                        CloudControllerUtil.sleep(1000);
+
+                    }
+
+                    // if there're still alive members
+                    if (members.size() > 0) {
+                        //forcefully terminate them
+                        for (Member member : members) {
+
+                            try {
+                                terminateInstance(member.getMemberId());
+                            } catch (Exception e) {
+                                // we are not gonna stop the execution due to errors.
+                                LOG.warn("Instance termination failed of member [id] " + member.getMemberId(), e);
+                            }
+                        }
+                    }
+                }
+            };
+            Runnable unregister = new Runnable() {
+                public void run() {
+                    ClusterContext ctxt = dataHolder.getClusterContext(clusterId_);
+                    if (ctxt == null) {
+                        String msg = "Service unregistration failed. Cluster not found: " + clusterId_;
+                        LOG.error(msg);
+                        return;
+                    }
+                    Collection<Member> members = TopologyManager.getTopology().
+                            getService(ctxt.getCartridgeType()).getCluster(clusterId_).getMembers();
+                    // TODO why end time is needed?
+                    // long endTime = System.currentTimeMillis() + ctxt.getTimeoutInMillis() * members.size();
+
+                    while (members.size() > 0) {
+                        //waiting until all the members got removed from the Topology/ timed out
+                        CloudControllerUtil.sleep(1000);
+                    }
+
+                    LOG.info("Unregistration of service cluster: " + clusterId_);
+                    deleteVolumes(ctxt);
+                    onClusterRemoval(clusterId_);
+                }
+
+                private void deleteVolumes(ClusterContext ctxt) {
+                    if (ctxt.isVolumeRequired()) {
+                        Cartridge cartridge = dataHolder.getCartridge(ctxt.getCartridgeType());
+                        if (cartridge != null && cartridge.getIaases() != null && ctxt.getVolumes() != null) {
+                            for (Volume volume : ctxt.getVolumes()) {
+                                if (volume.getId() != null) {
+                                    String iaasType = volume.getIaasType();
+                                    //Iaas iaas = dataHolder.getIaasProvider(iaasType).getIaas();
+                                    Iaas iaas = cartridge.getIaasProvider(iaasType).getIaas();
+                                    if (iaas != null) {
+                                        try {
+                                            // delete the volumes if remove on unsubscription is true.
+                                            if (volume.isRemoveOntermination()) {
+                                                iaas.deleteVolume(volume.getId());
+                                                volume.setId(null);
+                                            }
+                                        } catch (Exception ignore) {
+                                            if (LOG.isErrorEnabled()) {
+                                                LOG.error("Error while deleting volume [id] " + volume.getId(), ignore);
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+
+                        }
+                    }
+                }
+            };
+            new Thread(terminateInTimeout).start();
+            new Thread(unregister).start();
+        }
+    }
+
     @Override
-	public void unregisterDockerService(String clusterId)
-			throws UnregisteredClusterException {
-
-    	// terminate all kubernetes units
-    	try {
-			terminateAllContainers(clusterId);
-		} catch (InvalidClusterException e) {
-			String msg = "Docker instance termination fails for cluster: "+clusterId;
-			LOG.error(msg, e);
-			throw new UnregisteredClusterException(msg, e);
-		}
-    	// send cluster removal notifications and update the state
-		onClusterRemoval(clusterId);
-	}
+    public void unregisterDockerService(String clusterId)
+            throws UnregisteredClusterException {
+
+        // terminate all kubernetes units
+        try {
+            terminateAllContainers(clusterId);
+        } catch (InvalidClusterException e) {
+            String msg = "Docker instance termination fails for cluster: " + clusterId;
+            LOG.error(msg, e);
+            throw new UnregisteredClusterException(msg, e);
+        }
+        // send cluster removal notifications and update the state
+        onClusterRemoval(clusterId);
+    }
 
 
     @Override
-    public boolean validateDeploymentPolicy(String cartridgeType, Partition[] partitions) 
+    public boolean validateDeploymentPolicy(String cartridgeType, Partition[] partitions)
             throws InvalidPartitionException, InvalidCartridgeTypeException {
 
-    	Map<String, List<String>> validatedCache = dataHolder.getCartridgeTypeToPartitionIds();
-    	List<String> validatedPartitions = new ArrayList<String>();
-    	
-    	if (validatedCache.containsKey(cartridgeType)) {
-    		// cache hit for this cartridge
-    		// get list of partitions
-    		validatedPartitions = validatedCache.get(cartridgeType);
-    		if (LOG.isDebugEnabled()) {
-    			LOG.debug("Partition validation cache hit for cartridge type: "+cartridgeType);
-    		}
-    		
-    	}
-    	
+        Map<String, List<String>> validatedCache = dataHolder.getCartridgeTypeToPartitionIds();
+        List<String> validatedPartitions = new ArrayList<String>();
+
+        if (validatedCache.containsKey(cartridgeType)) {
+            // cache hit for this cartridge
+            // get list of partitions
+            validatedPartitions = validatedCache.get(cartridgeType);
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("Partition validation cache hit for cartridge type: " + cartridgeType);
+            }
+
+        }
+
         Map<String, IaasProvider> partitionToIaasProviders =
-                                                             new ConcurrentHashMap<String, IaasProvider>();
-        
+                new ConcurrentHashMap<String, IaasProvider>();
+
         if (LOG.isDebugEnabled()) {
-			LOG.debug("Deployment policy validation started for cartridge type: "+cartridgeType);
-		}
+            LOG.debug("Deployment policy validation started for cartridge type: " + cartridgeType);
+        }
 
         Cartridge cartridge = dataHolder.getCartridge(cartridgeType);
 
@@ -1326,138 +1324,138 @@ public class CloudControllerServiceImpl implements CloudControllerService {
             LOG.error(msg);
             throw new InvalidCartridgeTypeException(msg);
         }
-        
+
         Map<String, Future<IaasProvider>> jobList = new HashMap<String, Future<IaasProvider>>();
 
-		for (Partition partition : partitions) {
-			
-			if (validatedPartitions.contains(partition.getId())) {
-				// partition cache hit
-				continue;
-			}
-			
-			Callable<IaasProvider> worker = new PartitionValidatorCallable(
-					partition, cartridge);
-			Future<IaasProvider> job = FasterLookUpDataHolder.getInstance()
-					.getExecutor().submit(worker);
-			jobList.put(partition.getId(), job);
-		}
-        
+        for (Partition partition : partitions) {
+
+            if (validatedPartitions.contains(partition.getId())) {
+                // partition cache hit
+                continue;
+            }
+
+            Callable<IaasProvider> worker = new PartitionValidatorCallable(
+                    partition, cartridge);
+            Future<IaasProvider> job = FasterLookUpDataHolder.getInstance()
+                    .getExecutor().submit(worker);
+            jobList.put(partition.getId(), job);
+        }
+
         // Retrieve the results of the concurrently performed sanity checks.
         for (Entry<String, Future<IaasProvider>> entry : jobList.entrySet()) {
             if (entry == null) {
                 continue;
             }
             String partitionId = entry.getKey();
-        	Future<IaasProvider> job = entry.getValue();
+            Future<IaasProvider> job = entry.getValue();
             try {
-            	// add to a temporary Map
-            	partitionToIaasProviders.put(partitionId, job.get());
-            	
-            	// add to cache
-            	this.dataHolder.addToCartridgeTypeToPartitionIdMap(cartridgeType, partitionId);
-            	
-				if (LOG.isDebugEnabled()) {
-					LOG.debug("Partition "+partitionId+" added to the cache against cartridge type: "+cartridgeType);
-				}
+                // add to a temporary Map
+                partitionToIaasProviders.put(partitionId, job.get());
+
+                // add to cache
+                this.dataHolder.addToCartridgeTypeToPartitionIdMap(cartridgeType, partitionId);
+
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug("Partition " + partitionId + " added to the cache against cartridge type: " + cartridgeType);
+                }
             } catch (Exception e) {
                 LOG.error(e.getMessage(), e);
                 throw new InvalidPartitionException(e.getMessage(), e);
-            } 
+            }
         }
 
         // if and only if the deployment policy valid
         cartridge.addIaasProviders(partitionToIaasProviders);
-        
+
         // persist data
         persist();
-        
-        LOG.info("All partitions "+CloudControllerUtil.getPartitionIds(partitions)+
-        		" were validated successfully, against the Cartridge: "+cartridgeType);
-        
+
+        LOG.info("All partitions " + CloudControllerUtil.getPartitionIds(partitions) +
+                " were validated successfully, against the Cartridge: " + cartridgeType);
+
         return true;
     }
-    
+
     private void onClusterRemoval(final String clusterId) {
-		ClusterContext ctxt = dataHolder.getClusterContext(clusterId);
-		TopologyBuilder.handleClusterRemoved(ctxt);
-		dataHolder.removeClusterContext(clusterId);
-		dataHolder.removeMemberContextsOfCluster(clusterId);
-		persist();
-	}
+        ClusterContext ctxt = dataHolder.getClusterContext(clusterId);
+        TopologyBuilder.handleClusterRemoved(ctxt);
+        dataHolder.removeClusterContext(clusterId);
+        dataHolder.removeMemberContextsOfCluster(clusterId);
+        persist();
+    }
 
     @Override
     public boolean validatePartition(Partition partition) throws InvalidPartitionException {
         handleNullObject(partition, "Partition validation failed. Partition is null.");
         String provider = partition.getProvider();
-        handleNullObject(provider, "Partition ["+partition.getId()+"] validation failed. Partition provider is null.");
+        handleNullObject(provider, "Partition [" + partition.getId() + "] validation failed. Partition provider is null.");
         IaasProvider iaasProvider = dataHolder.getIaasProvider(provider);
 
         if (iaasProvider == null) {
             String msg =
-                         "Invalid Partition - " + partition.toString()+". Cause: Iaas Provider " +
-                                 "is null for Partition Provider: "+provider;
+                    "Invalid Partition - " + partition.toString() + ". Cause: Iaas Provider " +
+                            "is null for Partition Provider: " + provider;
             LOG.error(msg);
             throw new InvalidPartitionException(msg);
         }
-        
+
         Iaas iaas = iaasProvider.getIaas();
-        
+
         if (iaas == null) {
-            
-       

<TRUNCATED>