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

[4/4] stratos git commit: Refining application deployment process

Refining application deployment process


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

Branch: refs/heads/4.1.0-test
Commit: fbcf3847175c69604fed3b56c97085f16ab7d02c
Parents: e11d743
Author: Imesh Gunaratne <im...@apache.org>
Authored: Mon Dec 15 23:38:22 2014 +0530
Committer: Imesh Gunaratne <im...@apache.org>
Committed: Mon Dec 15 23:43:31 2014 +0530

----------------------------------------------------------------------
 .../autoscaler/api/AutoScalerServiceImpl.java   |  179 +--
 .../applications/pojo/ApplicationContext.java   |   18 +-
 .../applications/topic/ApplicationBuilder.java  |    2 +-
 .../autoscaler/context/AutoscalerContext.java   |   56 +-
 .../interfaces/AutoScalerServiceInterface.java  |  100 +-
 .../autoscaler/registry/RegistryManager.java    |  164 +-
 .../autoscaler/util/AutoScalerConstants.java    |    1 +
 .../controller/util/CloudControllerUtil.java    |   48 +-
 .../stratos/common/beans/ApplicationBean.java   |   32 +-
 .../manager/client/AutoscalerServiceClient.java |   64 +-
 .../beans/ApplicationDefinition.java            |   15 +-
 .../domain/applications/Application.java        |   18 +
 .../rest/endpoint/api/StratosApiV40.java        |   30 +-
 .../rest/endpoint/api/StratosApiV40Utils.java   |   75 -
 .../rest/endpoint/api/StratosApiV41.java        |  212 ++-
 .../rest/endpoint/api/StratosApiV41Utils.java   |  200 ++-
 .../endpoint/util/converter/PojoConverter.java  |  144 +-
 .../src/main/resources/AutoScalerService.wsdl   | 1507 ++++++------------
 18 files changed, 1227 insertions(+), 1638 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/fbcf3847/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java
index 9f42599..d5c92e9 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java
@@ -71,83 +71,11 @@ public class AutoScalerServiceImpl implements AutoScalerServiceInterface {
 
     private static final Log log = LogFactory.getLog(AutoScalerServiceImpl.class);
 
-    public DeploymentPolicy[] getAllDeploymentPolicies() {
-        return PolicyManager.getInstance().getDeploymentPolicyList();
-    }
 
-    public AutoscalePolicy[] getAllAutoScalingPolicy() {
+    public AutoscalePolicy[] getAutoScalingPolicies() {
         return PolicyManager.getInstance().getAutoscalePolicyList();
     }
 
-    @Override
-    public DeploymentPolicy[] getValidDeploymentPoliciesforCartridge(String cartridgeType) {
-        ArrayList<DeploymentPolicy> validPolicies = new ArrayList<DeploymentPolicy>();
-
-        for (DeploymentPolicy deploymentPolicy : this.getAllDeploymentPolicies()) {
-            /*try {
-                // call CC API
-                //CloudControllerClient.getInstance().validateDeploymentPolicy(cartridgeType, deploymentPolicy);
-                // if this deployment policy is valid for this cartridge, add it.
-                validPolicies.add(deploymentPolicy);
-            } catch (PartitionValidationException ignoredException) {
-                // if this policy doesn't valid for the given cartridge, add a debug log.
-                if (log.isDebugEnabled()) {
-                    log.debug("Deployment policy [id] " + deploymentPolicy.getApplicationId()
-                            + " is not valid for Cartridge [type] " + cartridgeType, ignoredException);
-                }
-            }*/
-        }
-        return validPolicies.toArray(new DeploymentPolicy[0]);
-    }
-    
-    @Override
-    public boolean deployDeploymentPolicy(DeploymentPolicy policy) {
-        try {
-            String policyId = PolicyManager.getInstance().deployDeploymentPolicy(policy);
-        } catch (InvalidPolicyException e) {
-            log.error("Error while deploying the deployment policy " + policy.getApplicationId(), e);
-        }
-        //Need to start the application Monitor after validation of the deployment policies.
-        //FIXME add validation
-        validateDeploymentPolicy(policy);
-        //Check whether all the clusters are there
-        ApplicationHolder.acquireReadLock();
-        boolean allClusterInitialized = false;
-        String appId = policy.getApplicationId();
-        try {
-            Application application = ApplicationHolder.getApplications().
-                    getApplication(policy.getApplicationId());
-            if (application != null) {
-
-                allClusterInitialized = AutoscalerUtil.allClustersInitialized(application);
-            }
-        } finally {
-            ApplicationHolder.releaseReadLock();
-        }
-
-        if (!AutoscalerContext.getInstance().containsPendingMonitor(appId)
-                                    || !AutoscalerContext.getInstance().monitorExists(appId)) {
-            if(allClusterInitialized) {
-                AutoscalerUtil.getInstance().
-                        startApplicationMonitor(appId);
-            } else {
-                log.info("The application clusters are not yet created. " +
-                        "Waiting for them to be created");
-            }
-        } else {
-            log.info("The application Monitor has already been created for [Application] " + appId);
-        }
-        //FIXME add proper return value when validation is done properly
-        return true;
-    }
-
-    @Override
-    public String addDeploymentPolicy(DeploymentPolicy deploymentPolicy) throws InvalidPolicyException {
-        String policyId = PolicyManager.getInstance().deployDeploymentPolicy(deploymentPolicy);
-        
-        return policyId;
-    }
-
     private boolean validateDeploymentPolicy(DeploymentPolicy deploymentPolicy) {
 
         for(ChildPolicy childPolicy : deploymentPolicy.getChildPolicies()) {
@@ -211,16 +139,6 @@ public class AutoScalerServiceImpl implements AutoScalerServiceInterface {
     }
 
     @Override
-    public boolean undeployDeploymentPolicy(String applicationId) {
-        return ApplicationBuilder.handleApplicationPolicyUndeployed(applicationId);
-    }
-
-    @Override
-    public boolean updateDeploymentPolicy(DeploymentPolicy deploymentPolicy) throws InvalidPolicyException {
-        return PolicyManager.getInstance().updateDeploymentPolicy(deploymentPolicy);
-    }
-
-    @Override
     public boolean addAutoScalingPolicy(AutoscalePolicy autoscalePolicy) throws InvalidPolicyException {
         return PolicyManager.getInstance().deployAutoscalePolicy(autoscalePolicy);
     }
@@ -245,37 +163,94 @@ public class AutoScalerServiceImpl implements AutoScalerServiceInterface {
         return PolicyManager.getInstance().getDeploymentPolicy(deploymentPolicyId).getApplicationLevelNetworkPartitions();
     }
 
-    //    @Override
-    public Partition[] getPartitionsOfGroup(String deploymentPolicyId, String groupId) {
-        DeploymentPolicy depPol = this.getDeploymentPolicy(deploymentPolicyId);
-        if (null == depPol) {
-            return null;
+    @Override
+    public void addApplication(ApplicationContext applicationContext)
+            throws ApplicationDefinitionException {
+        ApplicationParser applicationParser = new DefaultApplicationParser();
+        applicationParser.parse(applicationContext);
+        applicationContext.setStatus(ApplicationContext.STATUS_CREATED);
+        AutoscalerContext.getInstance().addApplicationContext(applicationContext);
+        if(log.isInfoEnabled()) {
+            log.info(String.format("Application added successfully: [application-id] ",
+                    applicationContext.getApplicationId()));
         }
+    }
 
-        ApplicationLevelNetworkPartition group = depPol.getApplicationLevelNetworkPartition(groupId);
-
-        if (group == null) {
-            return null;
-        }
+    @Override
+    public ApplicationContext getApplication(String applicationId) {
+        return AutoscalerContext.getInstance().getApplicationContext(applicationId);
+    }
 
-        return group.getPartitions();
+    @Override
+    public ApplicationContext[] getApplications() {
+        return AutoscalerContext.getInstance().getApplicationContexts().
+                toArray(new ApplicationContext[AutoscalerContext.getInstance().getApplicationContexts().size()]);
     }
 
     @Override
-    public void deployApplicationDefinition(ApplicationContext applicationContext)
-            throws ApplicationDefinitionException {
+    public boolean deployApplication(String applicationId, DeploymentPolicy policy) throws ApplicationDefinitionException {
+        ApplicationContext applicationContext = RegistryManager.getInstance().getApplicationContext(applicationId);
+        if(applicationContext == null) {
+            throw new RuntimeException("Application not found: " + applicationId);
+        }
 
         ApplicationParser applicationParser = new DefaultApplicationParser();
         Application application = applicationParser.parse(applicationContext);
-        // publishMetadata(applicationParser, application.getUniqueIdentifier());
-        ApplicationBuilder.handleApplicationCreated(application,
-                applicationParser.getApplicationClusterContexts());
+        ApplicationBuilder.handleApplicationCreated(application, applicationParser.getApplicationClusterContexts());
+
+        try {
+            String policyId = PolicyManager.getInstance().deployDeploymentPolicy(policy);
+        } catch (InvalidPolicyException e) {
+            log.error("Error while deploying the deployment policy " + policy.getApplicationId(), e);
+        }
+
+        //Need to start the application Monitor after validation of the deployment policies.
+        //FIXME add validation
+        validateDeploymentPolicy(policy);
+        //Check whether all the clusters are there
+        ApplicationHolder.acquireReadLock();
+        boolean allClusterInitialized = false;
+        try {
+            application = ApplicationHolder.getApplications().getApplication(policy.getApplicationId());
+            if (application != null) {
+                allClusterInitialized = AutoscalerUtil.allClustersInitialized(application);
+            }
+        } finally {
+            ApplicationHolder.releaseReadLock();
+        }
+
+        if (!AutoscalerContext.getInstance().containsPendingMonitor(applicationId)
+                || !AutoscalerContext.getInstance().monitorExists(applicationId)) {
+            if(allClusterInitialized) {
+                AutoscalerUtil.getInstance().startApplicationMonitor(applicationId);
+            } else {
+                log.info("The application clusters are not yet created. " +
+                        "Waiting for them to be created");
+            }
+        } else {
+            log.info("The application Monitor has already been created for [Application] " + applicationId);
+        }
+        applicationContext.setStatus(ApplicationContext.STATUS_DEPLOYED);
+        AutoscalerContext.getInstance().updateApplicationContext(applicationContext);
+        return true;
     }
 
     @Override
-    public void unDeployApplicationDefinition(String applicationId, int tenantId, String tenantDomain)
-            throws ApplicationDefinitionException {
-        ApplicationBuilder.handleApplicationDeleted(applicationId);
+    public void undeployApplication(String applicationId) {
+        ApplicationBuilder.handleApplicationUndeployed(applicationId);
+
+        ApplicationContext applicationContext = AutoscalerContext.getInstance().getApplicationContext(applicationId);
+        applicationContext.setStatus(ApplicationContext.STATUS_CREATED);
+        AutoscalerContext.getInstance().updateApplicationContext(applicationContext);
+    }
+
+    @Override
+    public void deleteApplication(String applicationId) {
+        AutoscalerContext.getInstance().removeApplicationContext(applicationId);
+        if(log.isInfoEnabled()) {
+            log.info(String.format("Application deleted successfully: [application-id] ",
+                    applicationId));
+        }
     }
 
     public void updateClusterMonitor(String clusterId, Properties properties) throws InvalidArgumentException {

http://git-wip-us.apache.org/repos/asf/stratos/blob/fbcf3847/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/pojo/ApplicationContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/pojo/ApplicationContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/pojo/ApplicationContext.java
index 97fc537..6f48263 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/pojo/ApplicationContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/pojo/ApplicationContext.java
@@ -27,19 +27,17 @@ public class ApplicationContext implements Serializable {
 
     private static final long serialVersionUID = 6704036501869668646L;
 
-    private int tenantId;
+    public static final String STATUS_CREATED = "Created";
+    public static final String STATUS_DEPLOYED = "Deployed";
 
+    private int tenantId;
     private String tenantDomain;
-
     private String teantAdminUsername;
-
     private String applicationId;
-
     private String alias;
-
     private ComponentContext componentContext;
-
     private Properties properties;
+    private String status;
 
     public ApplicationContext() {
     }
@@ -100,4 +98,12 @@ public class ApplicationContext implements Serializable {
         this.properties = properties;
     }
 
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/fbcf3847/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java
index fb5909f..c85fe7f 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java
@@ -183,7 +183,7 @@ public class ApplicationBuilder {
         }
     }
 
-    public static void handleApplicationDeleted(String appId) {
+    public static void handleApplicationUndeployed(String appId) {
         if (log.isDebugEnabled()) {
             log.debug("Handling application unDeployment for [application-id] " + appId);
         }

http://git-wip-us.apache.org/repos/asf/stratos/blob/fbcf3847/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/AutoscalerContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/AutoscalerContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/AutoscalerContext.java
index 2452255..ce5e553 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/AutoscalerContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/AutoscalerContext.java
@@ -20,13 +20,13 @@
  */
 package org.apache.stratos.autoscaler.context;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
 
+import org.apache.stratos.autoscaler.applications.pojo.ApplicationContext;
 import org.apache.stratos.autoscaler.monitor.component.ApplicationMonitor;
 import org.apache.stratos.autoscaler.monitor.cluster.AbstractClusterMonitor;
+import org.apache.stratos.autoscaler.registry.RegistryManager;
 
 /**
  * It holds all cluster monitors which are active in stratos.
@@ -35,6 +35,8 @@ public class AutoscalerContext {
 
     private static final AutoscalerContext INSTANCE = new AutoscalerContext();
 
+    // Map<ApplicationId, ApplicationContext>
+    private Map<String, ApplicationContext> applicationContextMap;
     // Map<ClusterId, AbstractClusterMonitor>
     private Map<String, AbstractClusterMonitor> clusterMonitors;
     // Map<ApplicationId, ApplicationMonitor>
@@ -43,11 +45,29 @@ public class AutoscalerContext {
     private List<String> pendingApplicationMonitors;
 
     private AutoscalerContext() {
+        applicationContextMap = readApplicationContextsFromRegistry();
+        if(applicationContextMap == null) {
+            applicationContextMap = new ConcurrentHashMap<String, ApplicationContext>();
+        }
         setClusterMonitors(new HashMap<String, AbstractClusterMonitor>());
         setApplicationMonitors(new HashMap<String, ApplicationMonitor>());
         pendingApplicationMonitors = new ArrayList<String>();
     }
 
+    private Map<String, ApplicationContext> readApplicationContextsFromRegistry() {
+        String[] resourcePaths = RegistryManager.getInstance().getApplicationContextResourcePaths();
+        if((resourcePaths == null) || (resourcePaths.length == 0)) {
+            return null;
+        }
+
+        Map<String, ApplicationContext> applicationContextMap = new ConcurrentHashMap<String, ApplicationContext>();
+        for(String resourcePath : resourcePaths) {
+            ApplicationContext applicationContext = RegistryManager.getInstance().getApplicationContextByResourcePath(resourcePath);
+            applicationContextMap.put(applicationContext.getApplicationId(), applicationContext);
+        }
+        return applicationContextMap;
+    }
+
     public static AutoscalerContext getInstance() {
         return INSTANCE;
     }
@@ -115,4 +135,32 @@ public class AutoscalerContext {
     public boolean monitorExists(String appId) {
         return this.applicationMonitors.containsKey(appId);
     }
+
+    public void addApplicationContext(ApplicationContext applicationContext) {
+        applicationContextMap.put(applicationContext.getApplicationId(), applicationContext);
+        RegistryManager.getInstance().persistApplicationContext(applicationContext);
+    }
+
+    public void removeApplicationContext(String applicationId) {
+        if(applicationContextMap.containsKey(applicationId)) {
+            applicationContextMap.remove(applicationId);
+            RegistryManager.getInstance().removeApplicationContext(applicationId);
+        }
+    }
+
+    public ApplicationContext getApplicationContext(String applicationId) {
+        if(applicationContextMap.containsKey(applicationId)) {
+            return applicationContextMap.get(applicationId);
+        }
+        return null;
+    }
+
+    public Collection<ApplicationContext> getApplicationContexts() {
+        return applicationContextMap.values();
+    }
+
+    public void updateApplicationContext(ApplicationContext applicationContext) {
+        applicationContextMap.put(applicationContext.getApplicationId(), applicationContext);
+        RegistryManager.getInstance().persistApplicationContext(applicationContext);
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/fbcf3847/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/interfaces/AutoScalerServiceInterface.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/interfaces/AutoScalerServiceInterface.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/interfaces/AutoScalerServiceInterface.java
index 096450a..9b5ea6a 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/interfaces/AutoScalerServiceInterface.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/interfaces/AutoScalerServiceInterface.java
@@ -31,29 +31,87 @@ import org.apache.stratos.autoscaler.pojo.policy.autoscale.AutoscalePolicy;
 import org.apache.stratos.common.Properties;
 
 public interface AutoScalerServiceInterface {
+    /**
+     * Add autoscaling policy
+     * @param autoscalePolicy
+     * @return
+     * @throws InvalidPolicyException
+     */
+    public boolean addAutoScalingPolicy(AutoscalePolicy autoscalePolicy) throws InvalidPolicyException;
 
-    public DeploymentPolicy[] getAllDeploymentPolicies();
+    /**
+     * Get an autoscaling policy
+     * @param autoscalingPolicyId
+     * @return
+     */
+    public AutoscalePolicy getAutoscalingPolicy(String autoscalingPolicyId);
 
-    public String addDeploymentPolicy(DeploymentPolicy depPolicy) throws InvalidPolicyException;
-    
-    public boolean deployDeploymentPolicy(DeploymentPolicy deploymentPolicy);
+    /**
+     * Get autoscaling policies
+     * @return
+     */
+    public AutoscalePolicy[] getAutoScalingPolicies();
 
-    public boolean undeployDeploymentPolicy(String deploymentPolicyName);
+    /**
+     * Update an autoscaling policy
+     * @param autoscalePolicy
+     * @return
+     * @throws InvalidPolicyException
+     */
+    public boolean updateAutoScalingPolicy(AutoscalePolicy autoscalePolicy) throws InvalidPolicyException;
 
-    public boolean updateDeploymentPolicy(DeploymentPolicy depPolicy) throws InvalidPolicyException;
+    /**
+     * Add an application
+     *
+     * @param applicationContext {@link org.apache.stratos.autoscaler.applications.pojo.ApplicationContext}
+     * @throws ApplicationDefinitionException if an error occurs
+     */
+    public void addApplication(ApplicationContext applicationContext) throws ApplicationDefinitionException;
 
-    public AutoscalePolicy[] getAllAutoScalingPolicy();
+    /**
+     * Get an application
+     * @param applicationId
+     */
+    public ApplicationContext getApplication(String applicationId);
 
-    public boolean addAutoScalingPolicy(AutoscalePolicy aspolicy) throws InvalidPolicyException;
+    /**
+     * Get all applications
+     */
+    public ApplicationContext[] getApplications();
 
-    public boolean updateAutoScalingPolicy(AutoscalePolicy aspolicy) throws InvalidPolicyException;
+    /**
+     * Deploy an application in created state
+     * @param applicationId
+     * @param deploymentPolicy
+     * @return
+     */
+    public boolean deployApplication(String applicationId, DeploymentPolicy deploymentPolicy) throws ApplicationDefinitionException;
 
-    public DeploymentPolicy[] getValidDeploymentPoliciesforCartridge(String cartridgeType);
+    /**
+     * Undeploy an application in deployed state
+     * @param applicationId
+     * @return
+     */
+    public void undeployApplication(String applicationId);
 
-    public DeploymentPolicy getDeploymentPolicy(String deploymentPolicyId);
+    /**
+     * Delete an application
+     * @param applicationId
+     */
+    public void deleteApplication(String applicationId);
 
-    public AutoscalePolicy getAutoscalingPolicy(String autoscalingPolicyId);
+    /**
+     * Returns a deployment policy of an application
+     * @param applicationId
+     * @return
+     */
+    public DeploymentPolicy getDeploymentPolicy(String applicationId);
 
+    /**
+     * Returns network partitions of a deployment policy
+     * @param deploymentPolicyId
+     * @return
+     */
     public org.apache.stratos.autoscaler.pojo.policy.deployment.partition.network.ApplicationLevelNetworkPartition[] getNetworkPartitions(String deploymentPolicyId);
 
     /**
@@ -62,24 +120,6 @@ public interface AutoScalerServiceInterface {
      * @param properties updated properties.
      */
     void updateClusterMonitor(String clusterId, Properties properties) throws InvalidArgumentException;
-    
-    /**
-     * deploys an Application Definition
-     *
-     * @param applicationContext {@link org.apache.stratos.autoscaler.applications.pojo.ApplicationContext} object
-     * @throws ApplicationDefinitionException if an error is encountered
-     */
-    public void deployApplicationDefinition (ApplicationContext applicationContext) throws ApplicationDefinitionException;
-
-    /**
-     * undeploys an Application Definition
-     *
-     * @param applicationId Id of the Application to be undeployed
-     * @throws ApplicationDefinitionException if an error is encountered
-     */
-    public void unDeployApplicationDefinition (String applicationId, int tenantId, String tenantDomain)
-            throws ApplicationDefinitionException;
-
 
     /**
      * Get service group by name

http://git-wip-us.apache.org/repos/asf/stratos/blob/fbcf3847/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/registry/RegistryManager.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/registry/RegistryManager.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/registry/RegistryManager.java
index 90fa388..28e107c 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/registry/RegistryManager.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/registry/RegistryManager.java
@@ -24,7 +24,7 @@ package org.apache.stratos.autoscaler.registry;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-//import org.apache.stratos.autoscaler.NetworkPartitionLbHolder;
+import org.apache.stratos.autoscaler.applications.pojo.ApplicationContext;
 import org.apache.stratos.autoscaler.exception.AutoScalerException;
 import org.apache.stratos.autoscaler.pojo.ServiceGroup;
 import org.apache.stratos.autoscaler.pojo.policy.autoscale.AutoscalePolicy;
@@ -117,24 +117,6 @@ public class RegistryManager {
         }
     }
 
-    public void persistPartition(Partition partition) {
-        String resourcePath = AutoScalerConstants.AUTOSCALER_RESOURCE + AutoScalerConstants.PARTITION_RESOURCE + "/" + partition.getId();
-        persist(partition, resourcePath);
-        if (log.isDebugEnabled()) {
-            log.debug(String.format("Partition written to registry: [id] %s [provider] %s [min] %d [max] %d",
-                    partition.getId(), partition.getProvider(), partition.getPartitionMin(), partition.getPartitionMax()));
-        }
-    }
-
-//    public void persistNetworkPartitionIbHolder(NetworkPartitionLbHolder nwPartitionLbHolder) {
-//        String resourcePath = AutoScalerConstants.AUTOSCALER_RESOURCE + AutoScalerConstants
-//                .NETWORK_PARTITION_LB_HOLDER_RESOURCE + "/" + nwPartitionLbHolder.getNetworkPartitionId();
-//        persist(nwPartitionLbHolder, resourcePath);
-//        if (log.isDebugEnabled()) {
-//            log.debug("NetworkPartitionContext written to registry: " + nwPartitionLbHolder.toString());
-//        }
-//    }
-
     public void persistAutoscalerPolicy(AutoscalePolicy autoscalePolicy) {
         String resourcePath = AutoScalerConstants.AUTOSCALER_RESOURCE + AutoScalerConstants.AS_POLICY_RESOURCE + "/" + autoscalePolicy.getId();
         persist(autoscalePolicy, resourcePath);
@@ -152,7 +134,6 @@ public class RegistryManager {
         }
     }
 
-
     public void persistApplication(Application application) {
 
         try {
@@ -174,7 +155,6 @@ public class RegistryManager {
     }
 
     public String[] getApplicationResourcePaths() {
-
         try {
             PrivilegedCarbonContext.startTenantFlow();
             PrivilegedCarbonContext carbonContext = PrivilegedCarbonContext.getThreadLocalCarbonContext();
@@ -192,11 +172,9 @@ public class RegistryManager {
                     return null;
                 }
             }
-
         } finally {
             PrivilegedCarbonContext.endTenantFlow();
         }
-
         return null;
     }
 
@@ -211,8 +189,7 @@ public class RegistryManager {
             Object obj = retrieve(applicationResourcePath);
             if (obj != null) {
                 try {
-                    Object dataObj = Deserializer
-                            .deserializeFromByteArray((byte[]) obj);
+                    Object dataObj = Deserializer.deserializeFromByteArray((byte[]) obj);
                     if (dataObj instanceof Application) {
                         return (Application) dataObj;
                     } else {
@@ -223,23 +200,72 @@ public class RegistryManager {
                     log.warn(msg, e);
                 }
             }
-            /*if (obj != null) {
-                if (obj instanceof Application) {
-                    return (Application) obj;
+        } finally {
+            PrivilegedCarbonContext.endTenantFlow();
+        }
+        return null;
+    }
+
+    public void removeApplication(String applicationId) {
+        try {
+            PrivilegedCarbonContext.startTenantFlow();
+            PrivilegedCarbonContext carbonContext = PrivilegedCarbonContext.getThreadLocalCarbonContext();
+            carbonContext.setTenantDomain(MultitenantConstants.SUPER_TENANT_DOMAIN_NAME);
+            carbonContext.setTenantId(MultitenantConstants.SUPER_TENANT_ID);
+
+            delete(AutoScalerConstants.AUTOSCALER_RESOURCE + AutoScalerConstants.APPLICATIONS_RESOURCE +
+                    "/" + applicationId);
+
+        } finally {
+            PrivilegedCarbonContext.endTenantFlow();
+        }
+    }
+
+    public void persistApplicationContext(ApplicationContext applicationContext) {
+
+        try {
+            PrivilegedCarbonContext.startTenantFlow();
+            PrivilegedCarbonContext carbonContext = PrivilegedCarbonContext.getThreadLocalCarbonContext();
+            carbonContext.setTenantDomain(MultitenantConstants.SUPER_TENANT_DOMAIN_NAME);
+            carbonContext.setTenantId(MultitenantConstants.SUPER_TENANT_ID);
+
+            String resourcePath = AutoScalerConstants.AUTOSCALER_RESOURCE +
+                    AutoScalerConstants.APPLICATION_CONTEXTS_RESOURCE + "/" + applicationContext.getApplicationId();
+            persist(applicationContext, resourcePath);
+            if (log.isDebugEnabled()) {
+                log.debug("Application context [" + applicationContext.getApplicationId() + "] " +
+                        "persisted successfully in the Autoscaler Registry");
+            }
+        } finally {
+            PrivilegedCarbonContext.endTenantFlow();
+        }
+    }
+
+    public String[] getApplicationContextResourcePaths() {
+        try {
+            PrivilegedCarbonContext.startTenantFlow();
+            PrivilegedCarbonContext carbonContext = PrivilegedCarbonContext.getThreadLocalCarbonContext();
+            carbonContext.setTenantDomain(MultitenantConstants.SUPER_TENANT_DOMAIN_NAME);
+            carbonContext.setTenantId(MultitenantConstants.SUPER_TENANT_ID);
+
+            Object obj = retrieve(AutoScalerConstants.AUTOSCALER_RESOURCE +
+                    AutoScalerConstants.APPLICATION_CONTEXTS_RESOURCE);
+
+            if (obj != null) {
+                if (obj instanceof String[]) {
+                    return (String[]) obj;
                 } else {
-                    log.warn("Expected object type not found for Application " + applicationResourcePath + " in Registry");
+                    log.warn("Expected object type not found for Applications in Registry");
                     return null;
                 }
-            }*/
-
+            }
         } finally {
             PrivilegedCarbonContext.endTenantFlow();
         }
-
         return null;
     }
 
-    public void removeApplication(String applicationId) {
+    public ApplicationContext getApplicationContext(String applicationId) {
 
         try {
             PrivilegedCarbonContext.startTenantFlow();
@@ -247,13 +273,48 @@ public class RegistryManager {
             carbonContext.setTenantDomain(MultitenantConstants.SUPER_TENANT_DOMAIN_NAME);
             carbonContext.setTenantId(MultitenantConstants.SUPER_TENANT_ID);
 
-            delete(AutoScalerConstants.AUTOSCALER_RESOURCE + AutoScalerConstants.APPLICATIONS_RESOURCE +
-                    "/" + applicationId);
+            String applicationResourcePath = AutoScalerConstants.AUTOSCALER_RESOURCE +
+                    AutoScalerConstants.APPLICATION_CONTEXTS_RESOURCE + "/" + applicationId;
+            return (ApplicationContext) getApplicationContextByResourcePath(applicationResourcePath);
+        } finally {
+            PrivilegedCarbonContext.endTenantFlow();
+        }
+    }
+
+    public ApplicationContext getApplicationContextByResourcePath(String resourcePath) {
 
+        try {
+            PrivilegedCarbonContext.startTenantFlow();
+            PrivilegedCarbonContext carbonContext = PrivilegedCarbonContext.getThreadLocalCarbonContext();
+            carbonContext.setTenantDomain(MultitenantConstants.SUPER_TENANT_DOMAIN_NAME);
+            carbonContext.setTenantId(MultitenantConstants.SUPER_TENANT_ID);
+
+            Object obj = retrieve(resourcePath);
+            if (obj != null) {
+                try {
+                    return (ApplicationContext) Deserializer.deserializeFromByteArray((byte[]) obj);
+                } catch (Exception e) {
+                    log.error("Could not deserialize application context", e);
+                }
+            }
+            return null;
         } finally {
             PrivilegedCarbonContext.endTenantFlow();
         }
+    }
 
+    public void removeApplicationContext(String applicationId) {
+        try {
+            PrivilegedCarbonContext.startTenantFlow();
+            PrivilegedCarbonContext carbonContext = PrivilegedCarbonContext.getThreadLocalCarbonContext();
+            carbonContext.setTenantDomain(MultitenantConstants.SUPER_TENANT_DOMAIN_NAME);
+            carbonContext.setTenantId(MultitenantConstants.SUPER_TENANT_ID);
+
+            delete(AutoScalerConstants.AUTOSCALER_RESOURCE + AutoScalerConstants.APPLICATION_CONTEXTS_RESOURCE +
+                    "/" + applicationId);
+        } finally {
+            PrivilegedCarbonContext.endTenantFlow();
+        }
     }
 
     public void persistServiceGroup(ServiceGroup servicegroup) {
@@ -324,39 +385,6 @@ public class RegistryManager {
         return partitionList;
     }
 
-//    public List<NetworkPartitionLbHolder> retrieveNetworkPartitionLbHolders() {
-//        List<NetworkPartitionLbHolder> nwPartitionLbHolderList = new ArrayList<NetworkPartitionLbHolder>();
-//        RegistryManager registryManager = RegistryManager.getInstance();
-//        String[] partitionsResourceList = (String[]) registryManager.retrieve(AutoScalerConstants.AUTOSCALER_RESOURCE +
-//                AutoScalerConstants.NETWORK_PARTITION_LB_HOLDER_RESOURCE);
-//
-//        if (partitionsResourceList != null) {
-//            NetworkPartitionLbHolder nwPartitionLbHolder;
-//            for (String resourcePath : partitionsResourceList) {
-//                Object serializedObj = registryManager.retrieve(resourcePath);
-//                if (serializedObj != null) {
-//                    try {
-//
-//                        Object dataObj = Deserializer.deserializeFromByteArray((byte[]) serializedObj);
-//                        if (dataObj instanceof NetworkPartitionLbHolder) {
-//                            nwPartitionLbHolder = (NetworkPartitionLbHolder) dataObj;
-//                            if (log.isDebugEnabled()) {
-//                                log.debug(String.format("NetworkPartitionLbHolder read from registry: " + nwPartitionLbHolder.toString()));
-//                            }
-//                            nwPartitionLbHolderList.add(nwPartitionLbHolder);
-//                        } else {
-//                            return null;
-//                        }
-//                    } catch (Exception e) {
-//                        String msg = "Unable to retrieve data from Registry. Hence, any historical NetworkPartitionLbHolder will not get reflected.";
-//                        log.warn(msg, e);
-//                    }
-//                }
-//            }
-//        }
-//        return nwPartitionLbHolderList;
-//    }
-
     public List<AutoscalePolicy> retrieveASPolicies() {
         List<AutoscalePolicy> asPolicyList = new ArrayList<AutoscalePolicy>();
         RegistryManager registryManager = RegistryManager.getInstance();

http://git-wip-us.apache.org/repos/asf/stratos/blob/fbcf3847/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoScalerConstants.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoScalerConstants.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoScalerConstants.java
index f5fede9..ff4959f 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoScalerConstants.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoScalerConstants.java
@@ -40,6 +40,7 @@ public final class AutoScalerConstants {
 	public static final String AS_POLICY_RESOURCE = "/policies/autoscalingPolicies";
 	public static final String DEPLOYMENT_POLICY_RESOURCE = "/policies/deploymentPolicies";
     public static final String APPLICATIONS_RESOURCE = "/applications";
+    public static final String APPLICATION_CONTEXTS_RESOURCE = "/applicationContexts";
 
     /**
      * Cluster monitoring  interval

http://git-wip-us.apache.org/repos/asf/stratos/blob/fbcf3847/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CloudControllerUtil.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CloudControllerUtil.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CloudControllerUtil.java
index c58eedc..dbf36bc 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CloudControllerUtil.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CloudControllerUtil.java
@@ -207,30 +207,30 @@ public class CloudControllerUtil {
 	  
     public static CartridgeInfo toCartridgeInfo(Cartridge cartridge) {
 
-		CartridgeInfo carInfo = new CartridgeInfo();
-		carInfo.setType(cartridge.getType());
-		carInfo.setDisplayName(cartridge.getDisplayName());
-		carInfo.setDescription(cartridge.getDescription());
-		carInfo.setHostName(cartridge.getHostName());
-		carInfo.setDeploymentDirs(cartridge.getDeploymentDirs());
-		carInfo.setProvider(cartridge.getProvider());
-	    carInfo.setCategory(cartridge.getCategory());
-		carInfo.setVersion(cartridge.getVersion());
-		carInfo.setMultiTenant(cartridge.isMultiTenant());
-		carInfo.setBaseDir(cartridge.getBaseDir());
-		carInfo.setLbConfig(cartridge.getLbConfig());
-		carInfo.setDefaultAutoscalingPolicy(cartridge.getDefaultAutoscalingPolicy());
-        carInfo.setDefaultDeploymentPolicy(cartridge.getDefaultDeploymentPolicy());
-		carInfo.setPortMappings(cartridge.getPortMappings()
-		                                 .toArray(new PortMapping[cartridge.getPortMappings()
-		                                                                   .size()]));
-		carInfo.setAppTypes(cartridge.getAppTypeMappings()
-                                .toArray(new AppType[cartridge.getAppTypeMappings()
-                                                                  .size()]));
-        carInfo.setServiceGroup(cartridge.getServiceGroup());
+		CartridgeInfo cartridgeInfo = new CartridgeInfo();
+		cartridgeInfo.setType(cartridge.getType());
+		cartridgeInfo.setDisplayName(cartridge.getDisplayName());
+		cartridgeInfo.setDescription(cartridge.getDescription());
+		cartridgeInfo.setHostName(cartridge.getHostName());
+		cartridgeInfo.setDeploymentDirs(cartridge.getDeploymentDirs());
+		cartridgeInfo.setProvider(cartridge.getProvider());
+	    cartridgeInfo.setCategory(cartridge.getCategory());
+		cartridgeInfo.setVersion(cartridge.getVersion());
+		cartridgeInfo.setMultiTenant(cartridge.isMultiTenant());
+		cartridgeInfo.setBaseDir(cartridge.getBaseDir());
+		cartridgeInfo.setLbConfig(cartridge.getLbConfig());
+		cartridgeInfo.setDefaultAutoscalingPolicy(cartridge.getDefaultAutoscalingPolicy());
+        cartridgeInfo.setDefaultDeploymentPolicy(cartridge.getDefaultDeploymentPolicy());
+		cartridgeInfo.setPortMappings(cartridge.getPortMappings()
+                .toArray(new PortMapping[cartridge.getPortMappings()
+                        .size()]));
+		cartridgeInfo.setAppTypes(cartridge.getAppTypeMappings()
+                .toArray(new AppType[cartridge.getAppTypeMappings()
+                        .size()]));
+        cartridgeInfo.setServiceGroup(cartridge.getServiceGroup());
 		
 		List<Property> propList = new ArrayList<Property>();
-        carInfo.setPersistence(cartridge.getPersistence());
+        cartridgeInfo.setPersistence(cartridge.getPersistence());
 		
 		for (Iterator<?> iterator = cartridge.getProperties().entrySet().iterator(); iterator.hasNext();) {
 	        @SuppressWarnings("unchecked")
@@ -241,9 +241,9 @@ public class CloudControllerUtil {
         }
 		Property[] props = new Property[propList.size()];
 		
-		carInfo.setProperties(propList.toArray(props));
+		cartridgeInfo.setProperties(propList.toArray(props));
 
-		return carInfo;
+		return cartridgeInfo;
 	}
 
     public static void sleep(long time){

http://git-wip-us.apache.org/repos/asf/stratos/blob/fbcf3847/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/beans/ApplicationBean.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/beans/ApplicationBean.java b/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/beans/ApplicationBean.java
index 7eb94e5..d64eb23 100644
--- a/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/beans/ApplicationBean.java
+++ b/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/beans/ApplicationBean.java
@@ -11,13 +11,14 @@ import java.util.List;
 @XmlRootElement(name="applications")
 public class ApplicationBean {
     private String id;
+    private String name;
+    private String description;
     private String tenantDomain;
     private String tenantAdminUsername;
     private List<GroupBean> groups = null;
     private List<Cluster> clusters = null;
     private List<Instance> instances;
 
-
     public ApplicationBean(){
         this.setGroups(new ArrayList<GroupBean>());
         this.setClusters(new ArrayList<Cluster>());
@@ -26,10 +27,30 @@ public class ApplicationBean {
         this.getGroups().add(groupBean);
     }
 
+    public String getId() {
+        return id;
+    }
+
     public void setId(String id) {
         this.id = id;
     }
 
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
     public void setTenantDomain(String tenantDomain) {
         this.tenantDomain = tenantDomain;
     }
@@ -38,10 +59,6 @@ public class ApplicationBean {
         this.tenantAdminUsername = tenantAdminUsername;
     }
 
-    public String getId() {
-        return id;
-    }
-
     public String getTenantDomain() {
         return tenantDomain;
     }
@@ -49,14 +66,15 @@ public class ApplicationBean {
     public String getTenantAdminUsername() {
         return tenantAdminUsername;
     }
+
 	public List<Instance> getInstances() {
 		return instances;
 	}
-	public void setInstances(List<Instance> instances) {
+
+    public void setInstances(List<Instance> instances) {
 		this.instances = instances;
 	}
 
-
     public List<GroupBean> getGroups() {
         return groups;
     }

http://git-wip-us.apache.org/repos/asf/stratos/blob/fbcf3847/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/client/AutoscalerServiceClient.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/client/AutoscalerServiceClient.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/client/AutoscalerServiceClient.java
index 545dcf5..394fd1f 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/client/AutoscalerServiceClient.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/client/AutoscalerServiceClient.java
@@ -96,7 +96,7 @@ public class AutoscalerServiceClient {
             throws RemoteException {
 
         org.apache.stratos.autoscaler.stub.autoscale.policy.AutoscalePolicy[] autoscalePolicies;
-        autoscalePolicies = stub.getAllAutoScalingPolicy();
+        autoscalePolicies = stub.getAutoScalingPolicies();
 
         return autoscalePolicies;
     }
@@ -110,29 +110,6 @@ public class AutoscalerServiceClient {
         return autoscalePolicy;
     }
 
-    public org.apache.stratos.autoscaler.stub.deployment.policy.DeploymentPolicy[] getDeploymentPolicies()
-            throws RemoteException {
-
-        org.apache.stratos.autoscaler.stub.deployment.policy.DeploymentPolicy[] deploymentPolicies;
-        deploymentPolicies = stub.getAllDeploymentPolicies();
-
-        return deploymentPolicies;
-    }
-
-    public org.apache.stratos.autoscaler.stub.deployment.policy.DeploymentPolicy[] getDeploymentPolicies(
-            String cartridgeType) throws RemoteException {
-
-        org.apache.stratos.autoscaler.stub.deployment.policy.DeploymentPolicy[] deploymentPolicies;
-        deploymentPolicies = stub
-                .getValidDeploymentPoliciesforCartridge(cartridgeType);
-
-        return deploymentPolicies;
-    }
-
-    public void unDeployDeploymentPolicy(String applicationId) throws RemoteException {
-        stub.undeployDeploymentPolicy(applicationId);
-    }
-
     public org.apache.stratos.autoscaler.stub.deployment.policy.DeploymentPolicy getDeploymentPolicy(String deploymentPolicyId) throws RemoteException {
 
         org.apache.stratos.autoscaler.stub.deployment.policy.DeploymentPolicy deploymentPolicy;
@@ -141,25 +118,32 @@ public class AutoscalerServiceClient {
         return deploymentPolicy;
     }
 
-    public String addDeploymentPolicy(DeploymentPolicy deploymentPolicy) throws RemoteException,
-    AutoScalerServiceInvalidPolicyExceptionException {
+    public void addApplication(ApplicationContext applicationContext) throws AutoScalerServiceApplicationDefinitionExceptionException, RemoteException {
+        stub.addApplication(applicationContext);
+    }
 
-    	return stub.addDeploymentPolicy(deploymentPolicy);
+    public ApplicationContext getApplication(String applicationId) throws RemoteException {
+        return stub.getApplication(applicationId);
+    }
 
+    public ApplicationContext[] getApplications() throws RemoteException {
+        return stub.getApplications();
     }
-    
-    public boolean deployDeploymentPolicy(DeploymentPolicy deploymentPolicy) throws RemoteException,
-            AutoScalerServiceInvalidPolicyExceptionException {
 
-        return stub.deployDeploymentPolicy(deploymentPolicy);
+    public boolean deployApplication(String applicationId, DeploymentPolicy deploymentPolicy) throws RemoteException,
+            AutoScalerServiceInvalidPolicyExceptionException, AutoScalerServiceApplicationDefinitionExceptionException {
 
-    }
+        return stub.deployApplication(applicationId, deploymentPolicy);
 
-    public boolean updateDeploymentPolicy(DeploymentPolicy deploymentPolicy) throws RemoteException,
-            AutoScalerServiceInvalidPolicyExceptionException {
+    }
 
-        return stub.updateDeploymentPolicy(deploymentPolicy);
+    public void undeployApplication(String applicationId) throws
+            AutoScalerServiceApplicationDefinitionExceptionException, RemoteException {
+        stub.undeployApplication(applicationId);
+    }
 
+    public void deleteApplication(String applicationId) throws RemoteException {
+        stub.deleteApplication(applicationId);
     }
 
     public boolean deployAutoscalingPolicy(AutoscalePolicy autoScalePolicy) throws RemoteException,
@@ -186,16 +170,6 @@ public class AutoscalerServiceClient {
         stub.deployServiceGroup(serviceGroup);
     }
 
-    public void deployApplication(ApplicationContext applicationContext) throws
-            AutoScalerServiceApplicationDefinitionExceptionException, RemoteException {
-        stub.deployApplicationDefinition(applicationContext);
-    }
-
-    public void undeployApplication(String applicationId, int tenantId, String tenantDomain) throws
-            AutoScalerServiceApplicationDefinitionExceptionException, RemoteException {
-        stub.unDeployApplicationDefinition(applicationId, tenantId, tenantDomain);
-    }
-
     public void updateClusterMonitor(String clusterId, Properties properties) throws RemoteException, AutoScalerServiceInvalidArgumentExceptionException {
         stub.updateClusterMonitor(clusterId, ApplicationManagementUtil.toAutoscalerStubProperties(properties));
     }

http://git-wip-us.apache.org/repos/asf/stratos/blob/fbcf3847/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/ApplicationDefinition.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/ApplicationDefinition.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/ApplicationDefinition.java
index 2a115e5..9701c34 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/ApplicationDefinition.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/ApplicationDefinition.java
@@ -30,11 +30,9 @@ public class ApplicationDefinition implements Serializable {
     private static final long serialVersionUID = -2829206180707597651L;
 
 	private String applicationId;
-
     private String alias;
-
     private ComponentDefinition components;
-    
+    private String status;
     private List<PropertyBean> property;
     
     public String getApplicationId() {
@@ -61,12 +59,19 @@ public class ApplicationDefinition implements Serializable {
         this.components = components;
     }
 
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
 	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/fbcf3847/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/Application.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/Application.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/Application.java
index b8e3ee3..6b01ddb 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/Application.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/Application.java
@@ -36,6 +36,8 @@ public class Application extends ParentComponent<ApplicationInstance> {
     private static final long serialVersionUID = -5092959597171649688L;
     // Unique id for the Application, defined in Application Definition
     private String id;
+    private String name;
+    private String description;
     // Key used for authentication (with metadata service, etc.)
     private String key;
     // tenant id
@@ -136,4 +138,20 @@ public class Application extends ParentComponent<ApplicationInstance> {
         return null;
 
     }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/fbcf3847/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV40.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV40.java b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV40.java
index 3cb5f24..81be753 100644
--- a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV40.java
+++ b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV40.java
@@ -167,10 +167,10 @@ public class StratosApiV40 extends AbstractApi {
     @Consumes("application/json")
     @AuthorizationAction("/permission/protected/manage/monitor/tenants")
     @SuperTenantService(true)
-    public StratosApiResponse deployDeploymentPolicyDefinition (DeploymentPolicy deploymentPolicy)
+    public Response deployDeploymentPolicyDefinition(DeploymentPolicy deploymentPolicy)
             throws RestAPIException {
-
-        return StratosApiV40Utils.deployDeploymentPolicy(deploymentPolicy);
+        // Not supported in 4.1.0
+        return Response.status(Response.Status.GONE).build();
     }
 
     @GET
@@ -178,9 +178,9 @@ public class StratosApiV40 extends AbstractApi {
     @Produces("application/json")
     @Consumes("application/json")
     @AuthorizationAction("/permission/protected/manage/monitor/tenants")
-    public Partition[] getPartitions () throws RestAPIException {
-
-        return StratosApiV40Utils.getAvailablePartitions();
+    public Response getPartitions() throws RestAPIException {
+        // Not supported in 4.1.0
+        return Response.status(Response.Status.GONE).build();
     }
 
     @GET
@@ -252,9 +252,9 @@ public class StratosApiV40 extends AbstractApi {
     @Produces("application/json")
     @Consumes("application/json")
     @AuthorizationAction("/permission/protected/manage/monitor/tenants")
-    public DeploymentPolicy[] getDeploymentPolicies () throws RestAPIException {
-
-        return StratosApiV40Utils.getDeploymentPolicies();
+    public Response getDeploymentPolicies() throws RestAPIException {
+        // Not supported in 4.1.0
+        return Response.status(Response.Status.GONE).build();
     }
 
     @GET
@@ -262,10 +262,10 @@ public class StratosApiV40 extends AbstractApi {
     @Produces("application/json")
     @Consumes("application/json")
     @AuthorizationAction("/permission/protected/manage/monitor/tenants")
-    public DeploymentPolicy getDeploymentPolicies (@PathParam("deploymentPolicyId") String deploymentPolicyId)
+    public Response getDeploymentPolicies(@PathParam("deploymentPolicyId") String deploymentPolicyId)
             throws RestAPIException {
-
-        return StratosApiV40Utils.getDeploymentPolicy(deploymentPolicyId);
+        // Not supported in 4.1.0
+        return Response.status(Response.Status.GONE).build();
     }
 
     @GET
@@ -273,10 +273,10 @@ public class StratosApiV40 extends AbstractApi {
     @Produces("application/json")
     @Consumes("application/json")
     @AuthorizationAction("/permission/protected/manage/monitor/tenants")
-    public DeploymentPolicy[] getValidDeploymentPolicies (@PathParam("cartridgeType") String cartridgeType)
+    public Response getValidDeploymentPolicies(@PathParam("cartridgeType") String cartridgeType)
             throws RestAPIException {
-
-        return StratosApiV40Utils.getDeploymentPolicies(cartridgeType);
+        // Not supported in 4.1.0
+        return Response.status(Response.Status.GONE).build();
     }
 
     @GET

http://git-wip-us.apache.org/repos/asf/stratos/blob/fbcf3847/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV40Utils.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV40Utils.java b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV40Utils.java
index 1ab2c33..d129da0 100644
--- a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV40Utils.java
+++ b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV40Utils.java
@@ -225,35 +225,6 @@ public class StratosApiV40Utils {
         return stratosApiResponse;
     }
 
-    public static StratosApiResponse deployDeploymentPolicy(
-            org.apache.stratos.common.beans.autoscaler.policy.deployment.DeploymentPolicy deploymentPolicyBean)
-            throws RestAPIException {
-
-        String policyId = null;
-
-        AutoscalerServiceClient autoscalerServiceClient = getAutoscalerServiceClient();
-        if (autoscalerServiceClient != null) {
-
-            DeploymentPolicy deploymentPolicy = PojoConverter.convetToASDeploymentPolicyPojo(deploymentPolicyBean);
-
-            try {
-                policyId = autoscalerServiceClient.addDeploymentPolicy(deploymentPolicy);
-            } catch (RemoteException e) {
-                log.error(e.getMessage(), e);
-                throw new RestAPIException(e.getMessage(), e);
-            } catch (AutoScalerServiceInvalidPolicyExceptionException e) {
-                String message = e.getFaultMessage().getInvalidPolicyException().getMessage();
-                log.error(message, e);
-                throw new RestAPIException(message, e);
-            }
-
-        }
-
-        StratosApiResponse stratosApiResponse = new StratosApiResponse();
-        stratosApiResponse.setMessage("Successfully deployed deployment policy definition with type " + policyId);
-        return stratosApiResponse;
-    }
-
     private static CloudControllerServiceClient getCloudControllerServiceClient () throws RestAPIException {
 
         try {
@@ -394,52 +365,6 @@ public class StratosApiV40Utils {
         return PojoConverter.populateAutoscalePojo(autoscalePolicy);
     }
 
-    public static org.apache.stratos.common.beans.autoscaler.policy.deployment.DeploymentPolicy[]
-    getDeploymentPolicies () throws RestAPIException {
-
-        DeploymentPolicy [] deploymentPolicies = null;
-        AutoscalerServiceClient autoscalerServiceClient = getAutoscalerServiceClient();
-        if (autoscalerServiceClient != null) {
-            try {
-                deploymentPolicies = autoscalerServiceClient.getDeploymentPolicies();
-            } catch (RemoteException e) {
-                String errorMsg = "Error getting available deployment policies. Cause : " + e.getMessage();
-                log.error(errorMsg, e);
-                throw new RestAPIException(errorMsg, e);
-            }
-        }
-
-
-
-        return PojoConverter.populateDeploymentPolicyPojos(deploymentPolicies);
-    }
-
-    public static org.apache.stratos.common.beans.autoscaler.policy.deployment.DeploymentPolicy[]
-    getDeploymentPolicies (String cartridgeType) throws RestAPIException {
-
-        DeploymentPolicy [] deploymentPolicies = null;
-        AutoscalerServiceClient autoscalerServiceClient = getAutoscalerServiceClient();
-        if (autoscalerServiceClient != null) {
-            try {
-                deploymentPolicies = autoscalerServiceClient.getDeploymentPolicies(cartridgeType);
-
-            } catch (RemoteException e) {
-                String errorMsg = "Error while getting available deployment policies for cartridge type " +
-                        cartridgeType+". Cause: "+e.getMessage();;
-                log.error(errorMsg, e);
-                throw new RestAPIException(errorMsg, e);
-            }
-        }
-
-        if(deploymentPolicies.length == 0) {
-            String errorMsg = "Cannot find any matching deployment policy for Cartridge [type] "+cartridgeType;
-            log.error(errorMsg);
-            throw new RestAPIException(errorMsg);
-        }
-
-        return PojoConverter.populateDeploymentPolicyPojos(deploymentPolicies);
-    }
-
     public static org.apache.stratos.common.beans.autoscaler.policy.deployment.DeploymentPolicy
     getDeploymentPolicy(String deploymentPolicyId) throws RestAPIException {
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/fbcf3847/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41.java b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41.java
index c44b5b0..c8ab6a1 100644
--- a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41.java
+++ b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41.java
@@ -323,8 +323,56 @@ public class StratosApiV41 extends AbstractApi {
         return Response.noContent().build();
     }
 
-    // API methods for application deployments
-    
+    // API methods for applications
+
+    /**
+     * Add application
+     * @param applicationDefinition
+     * @return
+     * @throws RestAPIException
+     */
+    @POST
+    @Path("/applications")
+    @Produces("application/json")
+    @Consumes("application/json")
+    @AuthorizationAction("/permission/admin/manage/add/application")
+    public Response addApplication(ApplicationDefinition applicationDefinition)
+            throws RestAPIException {
+        StratosApiV41Utils.addApplication(applicationDefinition, getConfigContext(), getUsername(), getTenantDomain());
+        URI url = uriInfo.getAbsolutePathBuilder().path(applicationDefinition.getApplicationId()).build();
+        return Response.created(url).build();
+    }
+
+    /**
+     * Return applications
+     * @return
+     * @throws RestAPIException
+     */
+    @GET
+    @Path("/applications")
+    @Produces("application/json")
+    @Consumes("application/json")
+    @AuthorizationAction("/permission/admin/manage/list/applications")
+    public Response getApplications()
+            throws RestAPIException {
+        List<ApplicationDefinition> applicationDefinitions = StratosApiV41Utils.getApplications();
+        return Response.ok(applicationDefinitions).build();
+    }
+
+    @GET
+    @Path("/applications/{applicationId}")
+    @Produces("application/json")
+    @Consumes("application/json")
+    @AuthorizationAction("/permission/admin/manage/list/applications")
+    public Response getApplication(@PathParam("applicationId") String applicationId)
+            throws RestAPIException {
+        ApplicationDefinition applicationDefinition = StratosApiV41Utils.getApplication(applicationId);
+        if(applicationDefinition == null) {
+            return Response.status(Response.Status.NOT_FOUND).build();
+        }
+        return Response.ok(applicationDefinition).build();
+    }
+
     /**
      * Deploy application.
      *
@@ -333,14 +381,13 @@ public class StratosApiV41 extends AbstractApi {
      * @throws RestAPIException the rest api exception
      */
     @POST
-    @Path("/applicationDeployments")
+    @Path("/application/{applicationId}/deploy")
     @Produces("application/json")
     @Consumes("application/json")
-    @AuthorizationAction("/permission/admin/manage/add/deploymentPolicy")
-    public Response deployApplication(DeploymentPolicy deploymentPolicy)
+    @AuthorizationAction("/permission/admin/manage/deploy/application")
+    public Response deployApplication(@PathParam("applicationId") String applicationId, DeploymentPolicy deploymentPolicy)
             throws RestAPIException {
-        StratosApiV41Utils.deployApplication(deploymentPolicy);
-        //URI url = uriInfo.getAbsolutePathBuilder().path(policyId).build();
+        StratosApiV41Utils.deployApplication(applicationId, deploymentPolicy);
         return Response.accepted().build();
     }
     
@@ -352,7 +399,7 @@ public class StratosApiV41 extends AbstractApi {
      * @throws RestAPIException the rest api exception
      */
     @DELETE
-    @Path("/applicationDeployments/{applicationId}")
+    @Path("/applications/{applicationId}/undeploy")
     @Produces("application/json")
     @Consumes("application/json")
     @AuthorizationAction("/permission/admin/manage/add/deploymentPolicy")
@@ -361,24 +408,50 @@ public class StratosApiV41 extends AbstractApi {
         StratosApiV41Utils.undeployApplication(applicationId);
         return Response.accepted().build();
     }
-    
-    // API methods for deployment policies
 
     /**
-     * Gets the deployment policies.
+     * This API resource provides information about the application denoted by the given appId. Details includes,
+     * Application details, top level cluster details, details of the group and sub groups.
      *
-     * @return the deployment policies
-     * @throws RestAPIException the rest api exception
+     * @param applicationId Id of the application.
+     * @return Json representing the application details with 200 as HTTP status. HTTP 404 is returned when there is
+     * no application with given Id.
+     * @throws RestAPIException is thrown in case of failure occurs.
      */
     @GET
-    @Path("/deploymentPolicies")
+    @Path("/applications/{applicationId}/runtime")
+    @Consumes("application/json")
+    @AuthorizationAction("/permission/protected/manage/list/applicationRuntimes")
+    public Response getApplicationRuntime(@PathParam("applicationId") String applicationId) throws RestAPIException {
+        ApplicationBean applicationRuntime = StratosApiV41Utils.getApplicationRuntime(applicationId);
+        if (applicationRuntime == null) {
+            return Response.status(Response.Status.NOT_FOUND).build();
+        } else {
+            return Response.ok().entity(applicationRuntime).build();
+        }
+    }
+
+    /**
+     * Delete an application.
+     *
+     * @param applicationId the application id
+     * @return the response
+     * @throws RestAPIException the rest api exception
+     */
+    @DELETE
+    @Path("/applications/{applicationId}")
     @Produces("application/json")
     @Consumes("application/json")
-    @AuthorizationAction("/permission/admin/manage/view/deploymentPolicy")
-    public Response getDeploymentPolicies() throws RestAPIException {
-        return Response.ok().entity(StratosApiV41Utils.getDeploymentPolicies()).build();
+    @AuthorizationAction("/permission/protected/manage/delete/application")
+    @SuperTenantService(true)
+    public Response deleteApplication(@PathParam("applicationId") String applicationId)
+            throws RestAPIException {
+        StratosApiV41Utils.deleteApplication(applicationId);
+        return Response.noContent().build();
     }
 
+    // API methods for deployment policies
+
     /**
      * Gets a specific deployment policy.
      *
@@ -412,27 +485,6 @@ public class StratosApiV41 extends AbstractApi {
             throws RestAPIException {
         return Response.ok().entity(StratosApiV41Utils.getPartitionGroups(deploymentPolicyId)).build();
     }
-    
-//    @GET
-//    @Path("/deploymentPolicies/{deploymentPolicyId}/partitionGroup/{partitionGroupId}")
-//    @Produces("application/json")
-//    @Consumes("application/json")
-//    @AuthorizationAction("/permission/admin/manage/view/partition")
-//    public Response getPartitionGroupForDeploymentPolicy(@PathParam("deploymentPolicyId") String deploymentPolicyId,
-//                                      @PathParam("partitionGroupId") String partitionGroupId) throws RestAPIException {
-//        return Response.ok().entity(StratosApiV41Utils.getPartitionsOfGroup(deploymentPolicyId, partitionGroupId)).build();
-//    }
-
-//    @GET
-//    @Path("/deploymentPolicies/{deploymentPolicyId}/partition")
-//    @Produces("application/json")
-//    @Consumes("application/json")
-//    @AuthorizationAction("/permission/admin/manage/view/partition")
-//    public Response getPartitionsForDeploymentPolicy(@PathParam("deploymentPolicyId") String deploymentPolicyId)
-//            throws RestAPIException {
-//
-//        return Response.ok().entity(StratosApiV41Utils.getPartitionsOfDeploymentPolicy(deploymentPolicyId)).build();
-//    }
 
     // API methods for autoscaling policies
     
@@ -511,90 +563,6 @@ public class StratosApiV41 extends AbstractApi {
         return Response.ok().build();
     }
 
-    // API methods for applications
-       
-    /**
-     * Gets details of all the applications.
-     *
-     * @return the applications
-     * @throws RestAPIException the rest api exception
-     */
-    @GET
-    @Path("/applications")
-    @Consumes("application/json")
-    @AuthorizationAction("/permission/protected/manage/monitor/tenants")
-    public Response getApplications() throws RestAPIException {
-        ApplicationBean[] applications = StratosApiV41Utils.getApplications();
-        if (applications == null) {
-            return Response.status(Response.Status.NOT_FOUND).build();
-        } else {
-            return Response.ok().entity(applications).build();
-        }
-    }
-
-    /**
-     * This API resource provides information about the application denoted by the given appId. Details includes,
-     * Application details, top level cluster details, details of the group and sub groups.
-     *
-     * @param applicationId Id of the application.
-     * @return Json representing the application details with 200 as HTTP status. HTTP 404 is returned when there is
-     * no application with given Id.
-     * @throws RestAPIException is thrown in case of failure occurs.
-     */
-    @GET
-    @Path("/applications/{applicationId}")
-    @Consumes("application/json")
-    @AuthorizationAction("/permission/protected/manage/monitor/tenants")
-    public Response getApplication(@PathParam("applicationId") String applicationId) throws RestAPIException {
-        ApplicationBean application = StratosApiV41Utils.getApplication(applicationId);
-        if (application == null) {
-            return Response.status(Response.Status.NOT_FOUND).build();
-        } else {
-            return Response.ok().entity(application).build();
-        }
-    }
-    
-    /**
-     * Creates the application definition.
-     *
-     * @param applicationDefinitionBean the application definition bean
-     * @return the response
-     * @throws RestAPIException the rest api exception
-     */
-    @POST
-    @Path("/applications")
-    @Produces("application/json")
-    @Consumes("application/json")
-    @AuthorizationAction("/permission/protected/manage/monitor/tenants")
-    @SuperTenantService(true)
-    public Response createApplicationDefinition(ApplicationDefinition applicationDefinitionBean)
-            throws RestAPIException {
-        StratosApiV41Utils.createApplicationDefinition(applicationDefinitionBean, getConfigContext(),
-                getUsername(), getTenantDomain());
-        URI url = uriInfo.getAbsolutePathBuilder().path(applicationDefinitionBean.getApplicationId()).build();
-        return Response.created(url).build();
-    }
-
-    /**
-	 * Removes the application definition.
-	 *
-	 * @param applicationId the application id
-	 * @return the response
-	 * @throws RestAPIException the rest api exception
-	 */
-	@DELETE
-    @Path("/applications/{applicationId}")
-    @Produces("application/json")
-    @Consumes("application/json")
-    @AuthorizationAction("/permission/protected/manage/monitor/tenants")
-    @SuperTenantService(true)
-    public Response deleteApplicationDefinition(@PathParam("applicationId") String applicationId)
-            throws RestAPIException {
-		StratosApiV41Utils.removeApplicationDefinition(applicationId, getConfigContext(), getUsername(),
-                getTenantDomain());
-        return Response.noContent().build();
-    }
-    
     // API methods for subscriptions
 
     /**