You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by me...@apache.org on 2014/06/26 22:31:50 UTC

[2/7] initial grouping code to develop cartridge grouping feature

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/CartridgeInfoBean.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/CartridgeInfoBean.java b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/CartridgeInfoBean.java
index e29d028..eec247d 100644
--- a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/CartridgeInfoBean.java
+++ b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/CartridgeInfoBean.java
@@ -18,7 +18,12 @@
  */
 package org.apache.stratos.rest.endpoint.bean;
 
+import org.apache.stratos.rest.endpoint.bean.cartridge.definition.PersistenceBean;
+import org.apache.stratos.rest.endpoint.bean.cartridge.definition.PropertyBean;
+
 import javax.xml.bind.annotation.XmlRootElement;
+import java.util.ArrayList;
+import java.util.List;
 
 @XmlRootElement
 public class CartridgeInfoBean {
@@ -34,11 +39,15 @@ public class CartridgeInfoBean {
     String dataCartridgeAlias;
     boolean commitsEnabled;
 
-    private boolean persistanceRequired;
-    private String size;
-    private boolean removeOnTermination;
     private String serviceGroup;
 
+    private PersistenceBean persistence;
+
+    private List<PropertyBean> property;
+
+    public CartridgeInfoBean() {
+    }
+
     public String getCartridgeType() {
         return cartridgeType;
     }
@@ -119,31 +128,7 @@ public class CartridgeInfoBean {
         this.deploymentPolicy = deploymentPolicy;
     }
 
-    public boolean isPersistanceRequired() {
-        return persistanceRequired;
-    }
-
-    public void setPersistanceRequired(boolean persistanceRequired) {
-        this.persistanceRequired = persistanceRequired;
-    }
-
-    public String getSize() {
-        return size;
-    }
-
-    public void setSize(String size) {
-        this.size = size;
-    }
-
-    public boolean isRemoveOnTermination() {
-        return removeOnTermination;
-    }
-
-    public void setRemoveOnTermination(boolean removeOnTermination) {
-        this.removeOnTermination = removeOnTermination;
-    }
-
-	public boolean isCommitsEnabled() {
+    public boolean isCommitsEnabled() {
 		return commitsEnabled;
 	}
 
@@ -158,5 +143,20 @@ public class CartridgeInfoBean {
 	public void setServiceGroup(String serviceGroup) {
 		this.serviceGroup = serviceGroup;
 	}
-    
+
+    public PersistenceBean getPersistence() {
+        return persistence;
+    }
+
+    public void setPersistence(PersistenceBean persistenceBean) {
+        this.persistence = persistenceBean;
+    }
+
+    public List<PropertyBean> getProperty() {
+        return property;
+    }
+
+    public void setProperty(List<PropertyBean> property) {
+        this.property = property;
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/cartridge/definition/VolumeBean.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/cartridge/definition/VolumeBean.java b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/cartridge/definition/VolumeBean.java
index 7eabb45..a9d7441 100644
--- a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/cartridge/definition/VolumeBean.java
+++ b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/cartridge/definition/VolumeBean.java
@@ -23,6 +23,8 @@ import javax.xml.bind.annotation.XmlRootElement;
 @XmlRootElement
 public class VolumeBean {
 
+    public String id;
+
     public String size;
 
     public String device;
@@ -30,6 +32,10 @@ public class VolumeBean {
     public boolean removeOnTermination;
 
     public String mappingPath;
+    
+    public String snapshotId;
+
+    public String volumeId;
 
     public String toString () {
         return " [ Persistence Required : " + ", Size: " + size + ", device: " +

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/compositeapplication/definition/CompositeApplicationDefinitionBean.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/compositeapplication/definition/CompositeApplicationDefinitionBean.java b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/compositeapplication/definition/CompositeApplicationDefinitionBean.java
new file mode 100644
index 0000000..2efc62b
--- /dev/null
+++ b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/compositeapplication/definition/CompositeApplicationDefinitionBean.java
@@ -0,0 +1,17 @@
+package org.apache.stratos.rest.endpoint.bean.compositeapplication.definition;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+import java.util.List;
+
+@XmlRootElement(name = "applicationDefinitionBean")
+
+public class CompositeApplicationDefinitionBean {
+	
+	public String applicationId;
+	public String alias;
+	public List<ConfigGroup> components;
+	public List<ConfigCartridge> cartridges;
+	
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/compositeapplication/definition/ConfigCartridge.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/compositeapplication/definition/ConfigCartridge.java b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/compositeapplication/definition/ConfigCartridge.java
new file mode 100644
index 0000000..85d57ce
--- /dev/null
+++ b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/compositeapplication/definition/ConfigCartridge.java
@@ -0,0 +1,8 @@
+package org.apache.stratos.rest.endpoint.bean.compositeapplication.definition;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement(name = "cartridge")
+public class ConfigCartridge {
+	public String alias;
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/compositeapplication/definition/ConfigDependencies.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/compositeapplication/definition/ConfigDependencies.java b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/compositeapplication/definition/ConfigDependencies.java
new file mode 100644
index 0000000..5efd201
--- /dev/null
+++ b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/compositeapplication/definition/ConfigDependencies.java
@@ -0,0 +1,57 @@
+package org.apache.stratos.rest.endpoint.bean.compositeapplication.definition;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement(name = "dependencies")
+public class ConfigDependencies {
+	public List<Pair> startup_order = new ArrayList<Pair>();
+	public String kill_behavior;
+		
+	/*
+	public String getKill_behavior() {
+		return kill_behavior;
+	}
+
+	public void setKill_behavior(String kill_behavior) {
+		this.kill_behavior = kill_behavior;
+	}
+
+	public List<Pair> getStartup_order() {
+		return startup_order;
+	}
+
+	public void setStartup_order(List<Pair> startup_order) {
+		this.startup_order = startup_order;
+	}
+	*/
+	
+
+	public static class Pair {
+		private String key;
+		private String value;
+		
+		private Pair() {}
+		
+		public Pair(String key, String value) {
+			this.key = key;
+			this.value = value;
+		}
+		
+		public String getKey() {
+			return key;
+		}
+		public void setKey(String key) {
+			this.key = key;
+		}
+		public String getValue() {
+			return value;
+		}
+		public void setValue(String value) {
+			this.value = value;
+		}
+	}
+	
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/compositeapplication/definition/ConfigGroup.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/compositeapplication/definition/ConfigGroup.java b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/compositeapplication/definition/ConfigGroup.java
new file mode 100644
index 0000000..bbdd0e3
--- /dev/null
+++ b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/compositeapplication/definition/ConfigGroup.java
@@ -0,0 +1,35 @@
+package org.apache.stratos.rest.endpoint.bean.compositeapplication.definition;
+
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement(name = "components")
+public class ConfigGroup {
+	public  String alias;
+	public  List<String> subscribables;
+	public ConfigDependencies dependencies;
+	
+	/*
+	public String getAlias() {
+		return alias;
+	}
+	public void setAlias(String alias) {
+		this.alias = alias;
+	}
+	public List<String> getSubscribables() {
+		return subscribables;
+	}
+	public void setSubscribables(List<String> subscribables) {
+		this.subscribables = subscribables;
+	}
+	public ConfigDependencies getDependencies() {
+		return dependencies;
+	}
+	public void setDependencies(ConfigDependencies dependencies) {
+		this.dependencies = dependencies;
+	}
+	*/
+
+	
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/util/converter/PojoConverter.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/util/converter/PojoConverter.java b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/util/converter/PojoConverter.java
index 1208967..84ddfbf 100644
--- a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/util/converter/PojoConverter.java
+++ b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/util/converter/PojoConverter.java
@@ -19,15 +19,31 @@
 
 package org.apache.stratos.rest.endpoint.bean.util.converter;
 
+import org.apache.commons.logging.LogFactory;
+import org.apache.commons.lang.StringUtils;
 import org.apache.stratos.cloud.controller.stub.pojo.*;
+import org.apache.stratos.manager.application.utils.ApplicationUtils;
 import org.apache.stratos.manager.deploy.service.Service;
 import org.apache.stratos.messaging.domain.topology.Cluster;
+import org.apache.stratos.messaging.domain.topology.CompositeApplication;
 import org.apache.stratos.rest.endpoint.bean.autoscaler.partition.Partition;
 import org.apache.stratos.rest.endpoint.bean.autoscaler.partition.PartitionGroup;
 import org.apache.stratos.rest.endpoint.bean.autoscaler.policy.autoscale.*;
 import org.apache.stratos.rest.endpoint.bean.autoscaler.policy.deployment.DeploymentPolicy;
 import org.apache.stratos.rest.endpoint.bean.cartridge.definition.*;
+import org.apache.stratos.rest.endpoint.bean.compositeapplication.definition.CompositeApplicationDefinitionBean;
+import org.apache.stratos.rest.endpoint.bean.compositeapplication.definition.ConfigCartridge;
+import org.apache.stratos.rest.endpoint.bean.compositeapplication.definition.ConfigDependencies;
+import org.apache.stratos.rest.endpoint.bean.compositeapplication.definition.ConfigGroup;
 import org.apache.stratos.rest.endpoint.bean.topology.Member;
+import org.apache.stratos.messaging.domain.topology.Cartridge;
+import org.apache.stratos.messaging.domain.topology.Composite;
+import org.apache.stratos.messaging.domain.topology.ConfigCompositeApplication;
+import org.apache.stratos.messaging.domain.topology.Dependencies;
+import org.apache.stratos.messaging.domain.topology.Group;
+import org.apache.stratos.messaging.domain.topology.Scalable;
+import org.apache.stratos.messaging.domain.topology.util.CompositeApplicationBuilder;
+import org.apache.commons.logging.Log;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -145,18 +161,25 @@ public class PojoConverter {
         return iaasConfigsArray;
     }
 
-    private static Persistence getPersistence(PersistenceBean persistenceBean) {
+    public static Persistence getPersistence(PersistenceBean persistenceBean) {
         Persistence persistence = new Persistence();
         persistence.setPersistanceRequired(persistenceBean.isRequired);
         VolumeBean[] volumeBean = new VolumeBean[persistenceBean.volume.size()];
         persistenceBean.volume.toArray(volumeBean);
-        Volume[] volumes = new Volume[persistenceBean.volume.size()];
-        for (int i = 0 ; i < volumes.length ; i++) {
+         Volume[] volumes = new Volume[persistenceBean.volume.size()];
+         for (int i = 0 ; i < volumes.length ; i++) {
             Volume volume = new Volume();
-            volume.setSize(Integer.parseInt(volumeBean[i].size));
+            volume.setId(volumeBean[i].id);
+            volume.setVolumeId(volumeBean[i].volumeId);
+            if(StringUtils.isEmpty(volume.getVolumeId())){
+                volume.setSize(Integer.parseInt(volumeBean[i].size));
+            }
+
             volume.setDevice(volumeBean[i].device);
             volume.setRemoveOntermination(volumeBean[i].removeOnTermination);
             volume.setMappingPath(volumeBean[i].mappingPath);
+            volume.setSnapshotId(volumeBean[i].snapshotId);
+
             volumes[i] = volume;
         }
         persistence.setVolumes(volumes);
@@ -164,7 +187,7 @@ public class PojoConverter {
 
     }
 
-    private static Properties getProperties (List<PropertyBean> propertyBeans) {
+    public static Properties getProperties(List<PropertyBean> propertyBeans) {
 
         //convert to an array
         PropertyBean [] propertyBeansArray = new PropertyBean[propertyBeans.size()];
@@ -636,4 +659,124 @@ public class PojoConverter {
 
         return serviceDefinitionBeans;
     }
+    
+	private static Log log = LogFactory.getLog(PojoConverter.class);
+	
+	
+	public static ConfigCompositeApplication convertToCompositeApplication(CompositeApplicationDefinitionBean appBean) {
+		ConfigCompositeApplication configApp = new ConfigCompositeApplication();
+		
+		configApp.setAlias(appBean.alias);
+		configApp.setApplicationId(appBean.applicationId);
+		
+		List<org.apache.stratos.messaging.domain.topology.ConfigCartridge> configCartridges = 
+				new ArrayList<org.apache.stratos.messaging.domain.topology.ConfigCartridge>();
+		
+		for (ConfigCartridge beanCartridge : appBean.cartridges ) {
+			org.apache.stratos.messaging.domain.topology.ConfigCartridge configCartridge = 
+					new org.apache.stratos.messaging.domain.topology.ConfigCartridge();
+			configCartridge.setAlias(beanCartridge.alias);
+			configCartridges.add(configCartridge);
+		}
+		configApp.setCartridges(configCartridges);
+		
+		// converting groups / components
+		List<org.apache.stratos.messaging.domain.topology.ConfigGroup> configGroups = 
+				new ArrayList<org.apache.stratos.messaging.domain.topology.ConfigGroup>();
+		
+		for (ConfigGroup beanGroup : appBean.components ) {
+			org.apache.stratos.messaging.domain.topology.ConfigGroup configGroup = 
+					new org.apache.stratos.messaging.domain.topology.ConfigGroup();
+			configGroup.setAlias(beanGroup.alias);
+			configGroup.setSubscribables(beanGroup.subscribables);
+			org.apache.stratos.messaging.domain.topology.ConfigDependencies configDep = 
+					new org.apache.stratos.messaging.domain.topology.ConfigDependencies();
+			
+			
+			// convert dependencies
+			configDep.setKill_behavior(beanGroup.dependencies.kill_behavior);
+			List<org.apache.stratos.messaging.domain.topology.ConfigDependencies.Pair> configPairs = 
+					new ArrayList<org.apache.stratos.messaging.domain.topology.ConfigDependencies.Pair>();
+			for (ConfigDependencies.Pair beanPair : beanGroup.dependencies.startup_order) {
+				configPairs.add(new org.apache.stratos.messaging.domain.topology.ConfigDependencies.Pair(beanPair.getKey(), beanPair.getValue()));
+			}
+			configDep.setStartup_order(configPairs);
+			configGroup.setDependencies(configDep);
+			
+			configGroups.add(configGroup);
+		}
+		configApp.setComponents(configGroups);
+		
+		return configApp;
+	}
+	
+	// grouping
+	public static CompositeApplicationDefinition convertToCompositeApplicationForCC (CompositeApplicationDefinitionBean appBean) {
+		CompositeApplicationDefinition configApp = new CompositeApplicationDefinition();
+		
+		configApp.setAlias(appBean.alias);
+		configApp.setApplicationId(appBean.applicationId);
+		
+		
+		
+		List<org.apache.stratos.cloud.controller.stub.pojo.ConfigCartridge> configCartridges = 
+				new ArrayList<org.apache.stratos.cloud.controller.stub.pojo.ConfigCartridge>();
+		
+		for (ConfigCartridge beanCartridge : appBean.cartridges ) {
+			org.apache.stratos.cloud.controller.stub.pojo.ConfigCartridge configCartridge = 
+					new org.apache.stratos.cloud.controller.stub.pojo.ConfigCartridge();
+			configCartridge.setAlias(beanCartridge.alias);
+			configCartridges.add(configCartridge);
+		}
+		org.apache.stratos.cloud.controller.stub.pojo.ConfigCartridge [] arrayConfigCartridge = 
+				new org.apache.stratos.cloud.controller.stub.pojo.ConfigCartridge[configCartridges.size()];
+		arrayConfigCartridge = configCartridges.toArray(arrayConfigCartridge);
+		configApp.setCartridges(arrayConfigCartridge);
+		
+		// converting groups / components
+		List<org.apache.stratos.cloud.controller.stub.pojo.ConfigGroup> configGroups = 
+				new ArrayList<org.apache.stratos.cloud.controller.stub.pojo.ConfigGroup>();
+		
+		for (ConfigGroup beanGroup : appBean.components ) {
+			org.apache.stratos.cloud.controller.stub.pojo.ConfigGroup configGroup = 
+					new org.apache.stratos.cloud.controller.stub.pojo.ConfigGroup();
+			configGroup.setAlias(beanGroup.alias);
+			String [] arraySubscribables = new String[beanGroup.subscribables.size()];
+			arraySubscribables = beanGroup.subscribables.toArray(arraySubscribables);
+			configGroup.setSubscribables(arraySubscribables);
+			org.apache.stratos.cloud.controller.stub.pojo.ConfigDependencies configDep = 
+					new org.apache.stratos.cloud.controller.stub.pojo.ConfigDependencies();
+			
+			
+			// convert dependencies
+			configDep.setKill_behavior(beanGroup.dependencies.kill_behavior);
+			int i = 0;
+			org.apache.stratos.cloud.controller.stub.pojo.ConfigDependencyPair[] configPairs = 
+					new org.apache.stratos.cloud.controller.stub.pojo.ConfigDependencyPair[beanGroup.dependencies.startup_order.size()];
+			
+			for (ConfigDependencies.Pair beanPair : beanGroup.dependencies.startup_order) {
+				//configPairs.add(new org.apache.stratos.messaging.domain.topology.ConfigDependencies.Pair(beanPair.getKey(), beanPair.getValue()));
+				
+				org.apache.stratos.cloud.controller.stub.pojo.ConfigDependencyPair pair = new org.apache.stratos.cloud.controller.stub.pojo.ConfigDependencyPair();
+				pair.setKey(beanPair.getKey());
+				pair.setValue(beanPair.getValue());
+				
+				configPairs[i] = pair;
+				i++;
+			}
+			configDep.setStartup_order(configPairs);
+			configGroup.setDependencies(configDep);
+			
+			configGroups.add(configGroup);
+			
+		}
+		org.apache.stratos.cloud.controller.stub.pojo.ConfigGroup [] configGroupArray  =  
+				new org.apache.stratos.cloud.controller.stub.pojo.ConfigGroup[configGroups.size()];
+		configGroupArray = configGroups.toArray(configGroupArray);
+		configApp.setComponents(configGroupArray);
+		
+		return configApp;
+	}
+    
+    
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/services/ServiceUtils.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/services/ServiceUtils.java b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/services/ServiceUtils.java
index 44b2c26..c88acf1 100644
--- a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/services/ServiceUtils.java
+++ b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/services/ServiceUtils.java
@@ -23,14 +23,19 @@ import org.apache.axis2.context.ConfigurationContext;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy;
+import org.apache.stratos.cloud.controller.stub.pojo.*;
 import org.apache.stratos.cloud.controller.stub.pojo.CartridgeConfig;
 import org.apache.stratos.cloud.controller.stub.pojo.CartridgeInfo;
+import org.apache.stratos.cloud.controller.stub.pojo.CompositeApplicationDefinition;
 import org.apache.stratos.cloud.controller.stub.pojo.Property;
 import org.apache.stratos.autoscaler.stub.AutoScalerServiceInvalidPartitionExceptionException;
 import org.apache.stratos.autoscaler.stub.AutoScalerServiceInvalidPolicyExceptionException;
 import org.apache.stratos.cloud.controller.stub.CloudControllerServiceInvalidCartridgeDefinitionExceptionException;
 import org.apache.stratos.cloud.controller.stub.CloudControllerServiceInvalidCartridgeTypeExceptionException;
+import org.apache.stratos.cloud.controller.stub.CloudControllerServiceInvalidCompositeApplicationDefinitionExceptionException;
 import org.apache.stratos.cloud.controller.stub.CloudControllerServiceInvalidIaasProviderExceptionException;
+import org.apache.stratos.manager.application.CompositeApplicationManager;
+import org.apache.stratos.manager.application.utils.ApplicationUtils;
 import org.apache.stratos.manager.client.AutoscalerServiceClient;
 import org.apache.stratos.manager.client.CloudControllerServiceClient;
 import org.apache.stratos.manager.deploy.service.Service;
@@ -48,6 +53,7 @@ import org.apache.stratos.manager.topology.model.TopologyClusterInformationModel
 import org.apache.stratos.manager.utils.ApplicationManagementUtil;
 import org.apache.stratos.manager.utils.CartridgeConstants;
 import org.apache.stratos.messaging.domain.topology.Cluster;
+import org.apache.stratos.messaging.domain.topology.ConfigCompositeApplication;
 import org.apache.stratos.messaging.domain.topology.Member;
 import org.apache.stratos.messaging.domain.topology.MemberStatus;
 import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
@@ -58,10 +64,15 @@ import org.apache.stratos.rest.endpoint.bean.autoscaler.partition.Partition;
 import org.apache.stratos.rest.endpoint.bean.autoscaler.partition.PartitionGroup;
 import org.apache.stratos.rest.endpoint.bean.autoscaler.policy.autoscale.AutoscalePolicy;
 import org.apache.stratos.rest.endpoint.bean.cartridge.definition.CartridgeDefinitionBean;
+import org.apache.stratos.rest.endpoint.bean.cartridge.definition.PersistenceBean;
 import org.apache.stratos.rest.endpoint.bean.cartridge.definition.ServiceDefinitionBean;
+import org.apache.stratos.rest.endpoint.bean.compositeapplication.definition.CompositeApplicationDefinitionBean;
+import org.apache.stratos.rest.endpoint.bean.compositeapplication.definition.ConfigDependencies;
+import org.apache.stratos.rest.endpoint.bean.compositeapplication.definition.ConfigGroup;
 import org.apache.stratos.rest.endpoint.bean.repositoryNotificationInfoBean.Payload;
 import org.apache.stratos.rest.endpoint.bean.util.converter.PojoConverter;
 import org.apache.stratos.rest.endpoint.exception.RestAPIException;
+import org.apache.stratos.messaging.domain.topology.CompositeApplication;
 
 import javax.ws.rs.core.Response;
 
@@ -74,6 +85,7 @@ public class ServiceUtils {
     public static final String SHOULD_DELETE_VOLUME = "volume.delete.on.unsubscription";
     public static final String VOLUME_SIZE = "volume.size.gb";
     public static final String DEVICE_NAME = "volume.device.name";
+    public static final String VOLUME_ID = "volume.id";
 
     private static Log log = LogFactory.getLog(ServiceUtils.class);
     private static CartridgeSubscriptionManager cartridgeSubsciptionManager = new CartridgeSubscriptionManager();
@@ -120,6 +132,197 @@ public class ServiceUtils {
         stratosAdminResponse.setMessage("Successfully deployed cartridge definition with type " + cartridgeDefinitionBean.type);
         return stratosAdminResponse;
     }
+    
+    // Grouping
+    /*
+    static StratosAdminResponse deployApplication(CompositeApplicationDefinitionBean applicationDefinitionBean, ConfigurationContext ctxt,
+            String userName, String tenantDomain) throws RestAPIException {
+
+    		log.info("Starting to deploy a application " + applicationDefinitionBean);
+    		
+    		if (log.isDebugEnabled()) {
+    			log.debug("application data id:" + applicationDefinitionBean.applicationId + " /alias: " + 
+    					applicationDefinitionBean.alias);
+    			if (applicationDefinitionBean.components != null) {
+    				log.debug("application config groups size " + applicationDefinitionBean.components.size());
+    				for (ConfigGroup cfg : applicationDefinitionBean.components) {
+    					log.debug("listing application config groups "  + cfg.alias + " /sub " + 
+    				               cfg.subscribables + " /dep " + cfg.dependencies);
+    					if (cfg.dependencies != null) {
+    						log.debug("listing application group dependencies: kill: " +  
+    					               cfg.dependencies.kill_behavior + " / startup: " + 
+    					               cfg.dependencies.startup_order);
+    						if (cfg.dependencies.startup_order != null) {
+    							for (ConfigDependencies.Pair pair :  cfg.dependencies.startup_order) {
+    								log.debug("listing dependencies pairs : " + pair.getKey() + " / " + pair.getValue());
+    							}
+    						}
+    					}
+    				}
+    			} else {
+    				log.debug("no config group in application");
+    			}
+
+    		}
+
+    		// convert to json
+    		String applicationId = applicationDefinitionBean.applicationId;
+    		
+    		if (log.isDebugEnabled()) {
+    			log.debug("publishing application created event " + applicationId);
+    		}
+    		
+    		// convert to domain object - move to ojoConverted
+    		ConfigCompositeApplication app = PojoConverter.convertToCompositeApplication(applicationDefinitionBean);
+    		if (log.isDebugEnabled()) {
+    			log.debug("converted application to CompositeApplication " + app);
+    		}
+    		CompositeApplicationManager manager = new CompositeApplicationManager();
+    		
+    		
+			try {
+				manager.deployCompositeApplication(app);
+			} catch (ADCException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+				String message = e.getMessage();
+				log.error(message, e);
+				throw new RestAPIException(message, e);
+			}
+    		
+    		log.info("l [type] " + applicationDefinitionBean);
+    		// deploy to cloud controller
+    		CloudControllerServiceClient cloudControllerServiceClient = getCloudControllerServiceClient();
+            
+    		
+    		if (log.isDebugEnabled()) {
+    			log.debug("deployeing composite app in cloud controller");
+    		}
+            
+            ServiceUtils.deployCompositeApplicationDefinition(applicationDefinitionBean, ctxt, userName, tenantDomain);
+    		 
+            if (log.isDebugEnabled()) {
+    			log.debug("done deployeing composite app in cloud controller");
+    		}
+
+    		StratosAdminResponse stratosAdminResponse = new StratosAdminResponse();
+    		stratosAdminResponse.setMessage("Successfully deployed application definition w" + applicationDefinitionBean);
+    		return stratosAdminResponse;
+    } */
+    
+    static StratosAdminResponse deployCompositeApplicationDefinition (CompositeApplicationDefinitionBean compositeApplicationDefinition, ConfigurationContext ctxt,
+            String userName, String tenantDomain) throws RestAPIException {
+
+            log.info("Starting to deploy composite application definition "+  compositeApplicationDefinition);
+            
+            CompositeApplicationDefinition appConfig = PojoConverter.convertToCompositeApplicationForCC(compositeApplicationDefinition);
+            
+
+            CloudControllerServiceClient cloudControllerServiceClient = getCloudControllerServiceClient();
+            
+            if (cloudControllerServiceClient != null) {
+    			// call CC
+            	try {
+					cloudControllerServiceClient
+					.deployCompositeApplicationDefinition(appConfig);
+				} catch (RemoteException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+					log.error(e.getMessage(), e);
+    				throw new RestAPIException(e.getMessage(), e);
+				} catch (CloudControllerServiceInvalidCompositeApplicationDefinitionExceptionException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+					//String message = e.getFaultMessage().getInvalidCompositeApplicationDefinitionException().getMessage();
+					String message = "CloudControllerServiceInvalidCompositeApplicationDefinitionExceptionException";
+    				log.error(message, e);
+    				throw new RestAPIException(message, e);
+				} catch (CloudControllerServiceInvalidIaasProviderExceptionException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+					String message = e.getFaultMessage().getInvalidIaasProviderException().getMessage();
+    				log.error(message, e);
+    				throw new RestAPIException(message, e);
+				}
+            	
+                log.info("Successfully composite application to cloud controller");
+                    
+            }
+
+            StratosAdminResponse stratosAdminResponse = new StratosAdminResponse();
+            stratosAdminResponse.setMessage("Successfully composite application to cloud controller");
+            return stratosAdminResponse;
+        }
+    
+    static StratosAdminResponse unDeployApplication(String configCompositeApplicationAlias, ConfigurationContext ctxt,
+            String userName, String tenantDomain) throws RestAPIException {
+
+    		log.info("Starting to undeploy a composite application definition " + configCompositeApplicationAlias);
+    		
+    		CloudControllerServiceClient cloudControllerServiceClient = getCloudControllerServiceClient();
+            
+            if (cloudControllerServiceClient != null) {
+            	try {
+            		if (log.isDebugEnabled()) {
+                		log.debug("trying to undeploy composite application definition " + configCompositeApplicationAlias);
+                	}
+					cloudControllerServiceClient.unDeployCompositeApplicationDefinition(configCompositeApplicationAlias);
+				} catch (RemoteException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+					String message = "Remote ExceptionException";
+    				log.error(message, e);
+    				throw new RestAPIException(message, e);
+				} catch (CloudControllerServiceInvalidCompositeApplicationDefinitionExceptionException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+					String message = "CloudControllerServiceInvalidCompositeApplicationDefinitionExceptionException";
+    				log.error(message, e);
+    				throw new RestAPIException(message, e);
+				} catch (CloudControllerServiceInvalidIaasProviderExceptionException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+					String message = "CloudControllerServiceInvalidIaasProviderExceptionException";
+    				log.error(message, e);
+    				throw new RestAPIException(message, e);
+				}
+            } else {
+            	if (log.isDebugEnabled()) {
+            		log.debug("cloud controller client is null while trying to undeploy composite application definition");
+            	}
+            }
+    		
+    		log.info("l [type] " + configCompositeApplicationAlias);
+
+    		StratosAdminResponse stratosAdminResponse = new StratosAdminResponse();
+    		stratosAdminResponse.setMessage("Successfully un-deployed application with alias " + configCompositeApplicationAlias);
+    		return stratosAdminResponse;
+    }
+    
+    
+    static StratosAdminResponse unDeployApplicationOld(String configCompositeApplicationAlias, ConfigurationContext ctxt,
+            String userName, String tenantDomain) throws RestAPIException {
+
+    		log.info("Starting to undeploy a composite application " + configCompositeApplicationAlias);
+    		
+    		CompositeApplicationManager manager = new CompositeApplicationManager();	
+    		
+			try {
+				manager.unDeployCompositeApplication(configCompositeApplicationAlias);
+			} catch (ADCException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+				String message = e.getMessage();
+				log.error(message, e);
+				throw new RestAPIException(message, e);
+			}
+    		
+    		log.info("l [type] " + configCompositeApplicationAlias);
+
+    		StratosAdminResponse stratosAdminResponse = new StratosAdminResponse();
+    		stratosAdminResponse.setMessage("Successfully un-deployed application with alias " + configCompositeApplicationAlias);
+    		return stratosAdminResponse;
+    }
 
     @SuppressWarnings("unused")
     private static DeploymentPolicy[] intersection(
@@ -993,14 +1196,30 @@ public class ServiceUtils {
         subscriptionData.setCommitsEnabled(cartridgeInfoBean.isCommitsEnabled());
         subscriptionData.setServiceGroup(cartridgeInfoBean.getServiceGroup());
         
+
+        PersistenceBean persistenceBean = cartridgeInfoBean.getPersistence();
+        if(persistenceBean != null) {
+            subscriptionData.setPersistence(PojoConverter.getPersistence(persistenceBean));
+        }
+        if(cartridgeInfoBean.getProperty() != null){
+            subscriptionData.setProperties(PojoConverter.getProperties(cartridgeInfoBean.getProperty()));
+        }
+
+        /*
+        if (cartridgeInfoBean.getPersistence() != null) {
+
         if (cartridgeInfoBean.isPersistanceRequired()) {
             // Add persistence related properties to PersistenceContext
             PersistenceContext persistenceContext = new PersistenceContext();
             persistenceContext.setPersistanceRequiredProperty(IS_VOLUME_REQUIRED, String.valueOf(cartridgeInfoBean.isPersistanceRequired()));
             persistenceContext.setSizeProperty(VOLUME_SIZE, cartridgeInfoBean.getSize());
             persistenceContext.setDeleteOnTerminationProperty(SHOULD_DELETE_VOLUME, String.valueOf(cartridgeInfoBean.isRemoveOnTermination()));
+            if(cartridgeInfoBean.getVolumeId() != null) {
+                persistenceContext.setVolumeIdProperty(VOLUME_ID, String.valueOf(cartridgeInfoBean.getVolumeId()));
+            }
             subscriptionData.setPersistanceCtxt(persistenceContext);
         }
+        */
 
         //subscribe
         return cartridgeSubsciptionManager.subscribeToCartridgeWithProperties(subscriptionData);
@@ -1072,6 +1291,7 @@ public class ServiceUtils {
             subscriptionData.setTenantId(ApplicationManagementUtil.getTenantId(configurationContext));
             subscriptionData.setTenantAdminUsername(userName);
             subscriptionData.setRepositoryType("git");
+            //subscriptionData.setPayloadProperties(props);
             //subscriptionData.setProperties(props);
             subscriptionData.setPrivateRepository(false);
 
@@ -1082,6 +1302,7 @@ public class ServiceUtils {
             cartridgeSubscription.getPayloadData().add("LOAD_BALANCED_SERVICE_TYPE", loadBalancedCartridgeType);
 
             Properties lbProperties = new Properties();
+            lbProperties.setPayloadProperties(props);
             lbProperties.setProperties(props);
             cartridgeSubsciptionManager.registerCartridgeSubscription(cartridgeSubscription, lbProperties);
             

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/services/StratosAdmin.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/services/StratosAdmin.java b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/services/StratosAdmin.java
index 7b744a5..a836fb7 100644
--- a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/services/StratosAdmin.java
+++ b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/services/StratosAdmin.java
@@ -39,6 +39,7 @@ import org.apache.stratos.rest.endpoint.bean.autoscaler.policy.autoscale.Autosca
 import org.apache.stratos.rest.endpoint.bean.autoscaler.policy.deployment.DeploymentPolicy;
 import org.apache.stratos.rest.endpoint.bean.cartridge.definition.CartridgeDefinitionBean;
 import org.apache.stratos.rest.endpoint.bean.cartridge.definition.ServiceDefinitionBean;
+import org.apache.stratos.rest.endpoint.bean.compositeapplication.definition.CompositeApplicationDefinitionBean;
 import org.apache.stratos.rest.endpoint.bean.repositoryNotificationInfoBean.Payload;
 import org.apache.stratos.rest.endpoint.bean.repositoryNotificationInfoBean.Repository;
 import org.apache.stratos.rest.endpoint.bean.topology.Cluster;
@@ -105,6 +106,75 @@ public class StratosAdmin extends AbstractAdmin {
         return Response.ok().header("WWW-Authenticate", "Basic").type(MediaType.APPLICATION_JSON).
                 entity(Utils.buildAuthenticationSuccessMessage(sessionId)).build();
     }
+    
+    @POST
+    @Path("/application/definition/")
+    @Produces("application/json")
+    @Consumes("application/json")
+    @AuthorizationAction("/permission/protected/manage/monitor/tenants")
+    @SuperTenantService(true)
+    // Grouping
+    public StratosAdminResponse deployApplicationDefinition(CompositeApplicationDefinitionBean applicationDefinitionBean)
+            throws RestAPIException {
+
+        /*return ServiceUtils.deployApplication(applicationDefinitionBean, getConfigContext(), getUsername(),
+                                     getTenantDomain());
+                                     */
+    	return ServiceUtils.deployCompositeApplicationDefinition(applicationDefinitionBean, getConfigContext(), getUsername(),
+                                     getTenantDomain());
+
+    }
+    
+    @POST
+    @Path("/application/definition/undeploy")
+    @Produces("application/json")
+    @Consumes("application/json")
+    @AuthorizationAction("/permission/protected/manage/monitor/tenants")
+    @SuperTenantService(true)
+    // Grouping
+    public StratosAdminResponse unDeployApplicationDefinition(String alias)
+            throws RestAPIException {
+
+        return ServiceUtils.unDeployApplication(alias, getConfigContext(), getUsername(),
+                                     getTenantDomain());
+
+    }
+    
+
+    
+    @DELETE
+    @Path("/application/definition/{applicationAlias}")
+    @Produces("application/json")
+    @Consumes("application/json")
+    @AuthorizationAction("/permission/protected/manage/monitor/tenants")
+    @SuperTenantService(true)
+    // Grouping
+    public StratosAdminResponse unDeployApplicationDefinitionX(@PathParam("applicationAlias")String  configCompositeApplicationAlias)
+            throws RestAPIException {
+
+        return ServiceUtils.unDeployApplication(configCompositeApplicationAlias, getConfigContext(), getUsername(),
+                getTenantDomain());
+
+    }
+    
+    
+    
+    /*
+     * Grouping --- fix  API, use this instead of POST to remove application !!!!
+   
+    @DELETE
+    @Path("/cartridge/definition/{cartridgeType}")
+    @Produces("application/json")
+    @Consumes("application/json")
+    @AuthorizationAction("/permission/protected/manage/monitor/tenants")
+    @SuperTenantService(true)
+    public StratosAdminResponse unDeployCartridgeDefinition (@PathParam("cartridgeType") String cartridgeType) throws RestAPIException {
+
+        return ServiceUtils.undeployCartridge(cartridgeType);
+    }
+    nnnnnn
+    */
+    
 
     @POST
     @Path("/cartridge/definition/")

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/products/cartridge-agent/modules/distribution/src/main/bin/stratos.sh
----------------------------------------------------------------------
diff --git a/products/cartridge-agent/modules/distribution/src/main/bin/stratos.sh b/products/cartridge-agent/modules/distribution/src/main/bin/stratos.sh
index db86d7d..317da88 100644
--- a/products/cartridge-agent/modules/distribution/src/main/bin/stratos.sh
+++ b/products/cartridge-agent/modules/distribution/src/main/bin/stratos.sh
@@ -44,7 +44,8 @@ properties="-Dmb.ip=MB-IP
 	    -Dmonitoring.server.port=MONITORING-SERVER-PORT
 	    -Dmonitoring.server.secure.port=MONITORING-SERVER-SECURE-PORT
 	    -Dmonitoring.server.admin.username=MONITORING-SERVER-ADMIN-USERNAME
-	    -Dmonitoring.server.admin.password=MONITORING-SERVER-ADMIN-PASSWORD"
+	    -Dmonitoring.server.admin.password=MONITORING-SERVER-ADMIN-PASSWORD
+	    -DAPP_PATH=APP-PATH"
 
 # Uncomment below line to enable remote debugging
 #debug="-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005"

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/products/cartridge-agent/modules/distribution/src/main/conf/templates/jndi.properties.template
----------------------------------------------------------------------
diff --git a/products/cartridge-agent/modules/distribution/src/main/conf/templates/jndi.properties.template b/products/cartridge-agent/modules/distribution/src/main/conf/templates/jndi.properties.template
index c6b062a..45b8d7a 100644
--- a/products/cartridge-agent/modules/distribution/src/main/conf/templates/jndi.properties.template
+++ b/products/cartridge-agent/modules/distribution/src/main/conf/templates/jndi.properties.template
@@ -20,6 +20,6 @@
 # Please use loadbalancer.conf for updating mb-ip, mb-port and templates/jndi.properties.template
 # file for updating other configurations.
 #
-connectionfactoryName=topicConnectionfactory
-connectionfactory.topicConnectionfactory=amqp://admin:admin@carbon/carbon?brokerlist='tcp://$mb_ip:$mb_port'
-java.naming.factory.initial=org.wso2.andes.jndi.PropertiesFileInitialContextFactory
+connectionfactoryName=TopicConnectionFactory
+connectionfactory.topicConnectionfactory=tcp://$mb_ip:$mb_port
+java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/products/cartridge-agent/modules/distribution/src/main/extensions/mount_volumes.sh
----------------------------------------------------------------------
diff --git a/products/cartridge-agent/modules/distribution/src/main/extensions/mount_volumes.sh b/products/cartridge-agent/modules/distribution/src/main/extensions/mount_volumes.sh
index 48f3ceb..63e303f 100755
--- a/products/cartridge-agent/modules/distribution/src/main/extensions/mount_volumes.sh
+++ b/products/cartridge-agent/modules/distribution/src/main/extensions/mount_volumes.sh
@@ -28,8 +28,8 @@ log=/var/log/apache-stratos/cartridge-agent-extensions.log
 echo -e "Starting mounting volumes" 2>&1 | tee -a $log
 
 # $1  is passed from Cartridge Agent code.
-echo -e "launh param file location $1" | tee -a $log
-#source /opt/apache-stratos-cartridge-agent/launch.params
+echo -e "launch param file location $1" | tee -a $log
+
 PERSISTENCE_MAPPING=$1
 echo -e "Persistance mappings : $PERSISTENCE_MAPPING" 2>&1 | tee -a $log
 
@@ -37,8 +37,29 @@ mount_volume(){
 
         device=$1;
         mount_point=$2;
-        echo "device $device"
-        echo "point  $mount_point"
+    echo -e "device $device" | tee -a $log
+        echo -e "mount point  $mount_point"| tee -a $log
+
+
+        if [  "$mount_point" = "null" ]
+        then
+              echo -e "[ERROR] Mount point can not be null" | tee -a $log
+          return
+        fi
+
+        if [  "$device" = "null" ]
+        then
+              echo -e "[ERROR] Device can not be null" | tee -a $log
+          return
+        fi
+
+        device_exist=`sudo fdisk -l $device`;
+        if [ "$device_exist" = "" ]
+        then
+              echo -e "[ERROR] Device $device does not exist in this instance." | tee -a $log
+          return
+    fi
+
         # check if the volume has a file system
         output=`sudo file -s $device`;
         echo $output | tee -a $log
@@ -59,15 +80,15 @@ mount_volume(){
         if [ ! -d "$mount_point" ]
         then
               echo "creating the  mount point directory $mount_point since it does not exist." | tee -a $log
-              sudo mkdir $mount_point
+              sudo mkdir -p $mount_point
         fi
 
         #mounting the device if it is not already mounted
         if [ ! "$device_mounted" = "" ]
         then
-              echo -e "Device $device is already mounted." | tee -a $log
+              echo -e "[WARNING] Device $device is already mounted." | tee -a $log
         else
-              sudo mount $device $mount_point
+              sudo mount $device $mount_point  2>&1 | tee -a $log
         fi
 
 }
@@ -75,12 +96,65 @@ mount_volume(){
 IFS='|' read -ra ADDR <<< "${PERSISTENCE_MAPPING}"
 echo "${ADDR[@]}" | tee -a $log
 
+echo -e "\n Volumes before mounting...." | tee -a $log
+output=`/bin/lsblk`
+echo -e "\n$output\n" | tee -a $log
+output=`/sbin/blkid`
+echo -e "\n$output\n" | tee -a $log
+
+totalcount=0
 for i in "${!ADDR[@]}"; do
-        # expected PERSISTANCE_MAPPING format is device1|mountPoint1|device2|mountpoint2...
-        # so that even indexes are devices and odd indexes are mount points..
-        if (( $i  % 2 == 0 ))
+        # expected PERSISTANCE_MAPPING format is device1|volumeID1|mountPoint1|device2|volumeID2|mountpoint2...
+        if (( $i  % 3 == 0 ))
         then
-           mount_volume ${ADDR[$i]} ${ADDR[$i + 1]}
+           devicelist[$totalcount]=${ADDR[$i]}
+           mountpathlist[$totalcount]=${ADDR[$i + 2]}
+           totalcount=$((totalcount+1))
+           lastdevice=${ADDR[$i]}
         fi
 done
 
+
+device_exist=`sudo fdisk -l $lastdevice`;
+if [ "$device_exist" = "" ]
+then
+# Last device doesn't exist, which means devices are not attached as per the order given in the payload
+# So start mounting from the last available device and come down
+    devlist=`sudo lsblk -n | cut -f 1 -d " "`
+    devcount=`echo ${devlist} | awk '{print NF}'`
+    totalcount=$((totalcount-1))
+        counter=0
+    for ((i=${devcount}-1; totalcount>=0; i--)); do
+        devnum=`expr ${devcount} - ${counter}`
+        currdevice=`echo ${devlist} | cut -d " " -f ${devnum}`
+        fileout=`sudo file -s /dev/${currdevice}`
+        if [[ $fileout == *ROM* ]] || [[ $fileout == *boot* ]] || [[ $fileout == *cloud* ]] || [[ $fileout == *not-regular* ]] || [[ $fileout == *empty* ]] || [[ $fileout == *swap* ]]
+        then
+            # Ignore special files as checked above...
+            counter=`expr ${counter} + 1`
+            continue
+        fi
+        mountpath=${mountpathlist[$totalcount]}
+        totalcount=$((totalcount-1))
+        echo "device is $currdevice"
+        echo "mount path is $mountpath"
+        counter=`expr ${counter} + 1`
+        mount_volume "/dev/${currdevice}" ${mountpath}
+    done
+else
+# Last device exists, which means the volumes are created or few might have been skipped in the first part since the device is already present
+# Mount of rest of the volumes will be fine and contine
+    for i in "${!ADDR[@]}"; do
+        # expected PERSISTANCE_MAPPING format is device1|volumeID1|mountPoint1|device2|volumeID2|mountpoint2...
+        if (( $i  % 3 == 0 ))
+        then
+           mount_volume ${ADDR[$i]} ${ADDR[$i + 2]}
+        fi
+    done
+fi
+
+echo -e "\n Volumes after mounting...." | tee -a $log
+output=`/bin/lsblk`
+echo -e "\n$output\n" | tee -a $log
+output=`/sbin/blkid`
+echo -e "\n$output\n" | tee -a $log

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/products/stratos/modules/distribution/src/assembly/bin.xml
----------------------------------------------------------------------
diff --git a/products/stratos/modules/distribution/src/assembly/bin.xml b/products/stratos/modules/distribution/src/assembly/bin.xml
index 6e1d991..0cefc0c 100755
--- a/products/stratos/modules/distribution/src/assembly/bin.xml
+++ b/products/stratos/modules/distribution/src/assembly/bin.xml
@@ -644,6 +644,12 @@
             <filtered>true</filtered>
             <fileMode>755</fileMode>
         </file>
+        <file>
+            <source>src/main/conf/terminatedependency.drl</source>
+            <outputDirectory>${pom.artifactId}-${pom.version}/repository/conf</outputDirectory>
+            <filtered>true</filtered>
+            <fileMode>755</fileMode>
+        </file>
 		<!-- autoscaler -->
         <file>
             <source>${project.basedir}/INSTALL.txt</source>

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/products/stratos/modules/distribution/src/main/conf/mincheck.drl
----------------------------------------------------------------------
diff --git a/products/stratos/modules/distribution/src/main/conf/mincheck.drl b/products/stratos/modules/distribution/src/main/conf/mincheck.drl
index b1c0f7c..b29e991 100755
--- a/products/stratos/modules/distribution/src/main/conf/mincheck.drl
+++ b/products/stratos/modules/distribution/src/main/conf/mincheck.drl
@@ -48,6 +48,10 @@ global org.apache.stratos.messaging.domain.topology.Topology $topology;
 global java.util.Map partitionCtxts;
 global java.lang.String clusterId;
 global java.lang.String lbRef;
+global java.lang.String serviceId;
+
+global org.apache.stratos.autoscaler.policy.model.AutoscalePolicy autoscalePolicy;
+
 
 rule "Minimum Rule"
 dialect "mvel"
@@ -57,6 +61,9 @@ dialect "mvel"
 	       eval(log.debug("[min-check] [network-partition] " + $ctxt.getNetworkPartitionId() + " [partition] " + $ctxt.getPartitionId() + " Non terminated member count: " + $ctxt.getNonTerminatedMemberCount()))
 	       eval(log.debug("[min-check] [network-partition] " + $ctxt.getNetworkPartitionId() + " [partition] " + $ctxt.getPartitionId() + " Minimum member count: " + $ctxt.getMinimumMemberCount()))
 	       eval($ctxt.getNonTerminatedMemberCount() < $ctxt.getMinimumMemberCount())
+	       eval(log.debug("Grouping ... checking startup dependencies for " + clusterId))
+           eval($ctxt.checkStartupDependencies(serviceId, clusterId))
+           eval(log.debug("startup dependencies successfully checked for" + clusterId))
 
        then
 	       $delegator.delegateSpawn($ctxt, clusterId, lbRef);

http://git-wip-us.apache.org/repos/asf/stratos/blob/67e868eb/products/stratos/modules/distribution/src/main/conf/terminatedependency.drl
----------------------------------------------------------------------
diff --git a/products/stratos/modules/distribution/src/main/conf/terminatedependency.drl b/products/stratos/modules/distribution/src/main/conf/terminatedependency.drl
new file mode 100644
index 0000000..9ea243c
--- /dev/null
+++ b/products/stratos/modules/distribution/src/main/conf/terminatedependency.drl
@@ -0,0 +1,52 @@
+/*
+ * 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.autoscaler.rule;
+
+import org.apache.stratos.messaging.domain.topology.Cluster;
+import org.apache.stratos.autoscaler.PartitionContext;
+
+global org.apache.stratos.autoscaler.rule.RuleLog log;
+global org.apache.stratos.autoscaler.rule.RuleTasksDelegator $delegator;
+global java.util.Map partitionCtxts;
+global java.lang.String clusterId;
+global java.lang.String lbRef;
+global java.lang.String serviceId;
+
+global org.apache.stratos.autoscaler.policy.model.AutoscalePolicy autoscalePolicy;
+
+rule "Terminate Dependency Rule"
+
+dialect "mvel"
+        when
+            $ctxt : PartitionContext ()
+            eval(log.debug("Running terminate dependency rule: [partition] " + $ctxt.getPartitionId() + " [network-partition] " + $ctxt.getNetworkPartitionId()))
+            eval(log.debug("[terminate dependency] [network-partition] " + $ctxt.getNetworkPartitionId() + " [partition] " + $ctxt.getPartitionId() +" Member count: " + $ctxt.getMemberStatsContexts().size()))
+            eval(log.debug("Grouping ... in terminatedependency rule terminating all members " + $ctxt.getAllMemberForTerminationCount()))
+            eval(!$ctxt.checkKillDependencies(serviceId, clusterId))
+            eval(log.debug("[terminate dependency] [network-partition] " + $ctxt.getNetworkPartitionId() + " [partition] " + $ctxt.getPartitionId() + " successfully terminated members"))
+ 
+            eval(log.debug("Grouping:terminatedependency:terminating all"))
+
+        then
+           $delegator.delegateTerminateAll(clusterId);
+end
+
+
+