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

[7/7] git commit: Policy and partition definition isolation in Autoscalar - minus tenant migration

Policy and partition definition isolation in Autoscalar - minus tenant migration


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

Branch: refs/heads/origin
Commit: 27568093258e68274c6a84f89aec7aa69e7d88f2
Parents: 6fae635
Author: Shiro <sh...@wso2.com>
Authored: Fri Sep 19 16:07:01 2014 +0530
Committer: Shiro <sh...@wso2.com>
Committed: Fri Sep 19 16:07:01 2014 +0530

----------------------------------------------------------------------
 .../internal/AutoscalerServerComponent.java     |  41 +-
 .../internal/TenantArtifactLoader.java          |  76 ++++
 .../autoscaler/partition/PartitionManager.java  | 107 ++++-
 .../autoscaler/policy/PolicyManager.java        | 389 +++++++++++++++----
 4 files changed, 495 insertions(+), 118 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/27568093/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/internal/AutoscalerServerComponent.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/internal/AutoscalerServerComponent.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/internal/AutoscalerServerComponent.java
index 4823057..6b139c8 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/internal/AutoscalerServerComponent.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/internal/AutoscalerServerComponent.java
@@ -31,9 +31,11 @@ import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy;
 import org.apache.stratos.autoscaler.registry.RegistryManager;
 import org.apache.stratos.autoscaler.util.ServiceReferenceHolder;
 import org.apache.stratos.cloud.controller.stub.deployment.partition.Partition;
+import org.osgi.framework.BundleContext;
 import org.osgi.service.component.ComponentContext;
 import org.wso2.carbon.registry.api.RegistryException;
 import org.wso2.carbon.registry.core.service.RegistryService;
+import org.wso2.carbon.utils.Axis2ConfigurationContextObserver;
 
 import java.util.Iterator;
 import java.util.List;
@@ -80,36 +82,25 @@ public class AutoscalerServerComponent {
             if (log.isDebugEnabled()) {
                 log.debug("Health message processor thread started");
             }
+            
+            // Register tenantLoadListener
+            BundleContext bundleContext = componentContext.getBundleContext();
+            TenantArtifactLoader listener = new TenantArtifactLoader();
+            bundleContext.registerService(
+                    Axis2ConfigurationContextObserver.class.getName(), listener, null);
+
 
             // Adding the registry stored partitions to the information model
-            List<Partition> partitions = RegistryManager.getInstance().retrievePartitions();
-            Iterator<Partition> partitionIterator = partitions.iterator();
-            while (partitionIterator.hasNext()) {
-                Partition partition = partitionIterator.next();
-                PartitionManager.getInstance().addPartitionToInformationModel(partition);
-            }
+            PartitionManager.getInstance().loadPartitionsToInformationModel();
             
             // Adding the network partitions stored in registry to the information model
-            List<NetworkPartitionLbHolder> nwPartitionHolders = RegistryManager.getInstance().retrieveNetworkPartitionLbHolders();
-            Iterator<NetworkPartitionLbHolder> nwPartitionIterator = nwPartitionHolders.iterator();
-            while (nwPartitionIterator.hasNext()) {
-                NetworkPartitionLbHolder nwPartition = nwPartitionIterator.next();
-                PartitionManager.getInstance().addNetworkPartitionLbHolder(nwPartition);
-            }
+            PartitionManager.getInstance().loadNetworkPartitionsToInformationModel();
             
-            List<AutoscalePolicy> asPolicies = RegistryManager.getInstance().retrieveASPolicies();
-            Iterator<AutoscalePolicy> asPolicyIterator = asPolicies.iterator();
-            while (asPolicyIterator.hasNext()) {
-                AutoscalePolicy asPolicy = asPolicyIterator.next();
-                PolicyManager.getInstance().addASPolicyToInformationModel(asPolicy);
-            }
-
-            List<DeploymentPolicy> depPolicies = RegistryManager.getInstance().retrieveDeploymentPolicies();
-            Iterator<DeploymentPolicy> depPolicyIterator = depPolicies.iterator();
-            while (depPolicyIterator.hasNext()) {
-                DeploymentPolicy depPolicy = depPolicyIterator.next();
-                PolicyManager.getInstance().addDeploymentPolicyToInformationModel(depPolicy);
-            }
+            // Adding the registry stored autoscaling policies to the information model
+            PolicyManager.getInstance().loadASPoliciesToInformationModel();
+            
+            // Adding the registry stored deployment policies to the information model
+            PolicyManager.getInstance().loadDeploymentPoliciesToInformationModel();
 
             if (log.isInfoEnabled()) {
                 log.info("Autoscaler Server Component activated");

http://git-wip-us.apache.org/repos/asf/stratos/blob/27568093/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/internal/TenantArtifactLoader.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/internal/TenantArtifactLoader.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/internal/TenantArtifactLoader.java
new file mode 100644
index 0000000..e85c753
--- /dev/null
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/internal/TenantArtifactLoader.java
@@ -0,0 +1,76 @@
+package org.apache.stratos.autoscaler.internal;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.axis2.context.ConfigurationContext;
+import org.apache.stratos.autoscaler.partition.PartitionManager;
+import org.apache.stratos.autoscaler.policy.PolicyManager;
+import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy;
+import org.apache.stratos.autoscaler.registry.RegistryManager;
+import org.wso2.carbon.context.CarbonContext;
+import org.wso2.carbon.utils.AbstractAxis2ConfigurationContextObserver;
+
+
+public class TenantArtifactLoader extends AbstractAxis2ConfigurationContextObserver
+{
+	public void creatingConfigurationContext(int tenantId) {
+		System.out.println("Just before creating");
+    }
+
+    public void createdConfigurationContext(ConfigurationContext configContext) {
+    	System.out.println("Just after creating");
+    	if(!checkIfArtifactsAreInSync()){
+        	updateArtifacts();
+        }
+    }
+
+    public void terminatingConfigurationContext(ConfigurationContext configCtx) {
+    	System.out.println("Just before removing");	
+    	clearArtifacts();
+    }
+
+    public void terminatedConfigurationContext(ConfigurationContext configCtx) {
+    	System.out.println("Just after removing");
+    }
+    
+    private boolean checkIfArtifactsAreInSync()
+    {
+    	int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId();
+    	System.out.println("************** Tenant ID : " + tenantId + "**************");
+    	
+    	// check whether tenant Id is present in inMemModels 
+    	return (PolicyManager.getInstance().isTenantPolicyDetailsInInformationModel(tenantId) && 
+    			PartitionManager.getInstance().isTenantPolicyDetailsInInformationModel(tenantId));
+    }
+    
+    private void updateArtifacts()
+    {
+    	// Adding the registry stored partitions to the information model
+        PartitionManager.getInstance().loadPartitionsToInformationModel();
+        
+        // Adding the network partitions stored in registry to the information model
+        PartitionManager.getInstance().loadNetworkPartitionsToInformationModel();
+        
+        // Adding the registry stored autoscaling policies to the information model
+        PolicyManager.getInstance().loadASPoliciesToInformationModel();
+        
+        // Adding the registry stored deployment policies to the information model
+        PolicyManager.getInstance().loadDeploymentPoliciesToInformationModel();
+    }
+    
+    private void clearArtifacts()
+    {
+    	int currentTenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId();
+    	System.out.println("************** Tenant ID : " + currentTenantId + "**************");
+    	
+    	// Adding the registry stored partitions to the information model
+        PartitionManager.getInstance().removePartitionsFromInformationModel(currentTenantId);
+               
+        // Adding the registry stored autoscaling policies to the information model
+        PolicyManager.getInstance().removeASPoliciesFromInformationModel(currentTenantId);
+        
+        // Adding the registry stored deployment policies to the information model
+        PolicyManager.getInstance().removeDeploymentPoliciesFromInformationModel(currentTenantId);
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/27568093/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/partition/PartitionManager.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/partition/PartitionManager.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/partition/PartitionManager.java
index 66aa501..cacc5a3 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/partition/PartitionManager.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/partition/PartitionManager.java
@@ -27,12 +27,17 @@ import org.apache.stratos.autoscaler.client.cloud.controller.CloudControllerClie
 import org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy;
 import org.apache.stratos.autoscaler.exception.AutoScalerException;
 import org.apache.stratos.autoscaler.exception.InvalidPartitionException;
+import org.apache.stratos.autoscaler.exception.InvalidPolicyException;
 import org.apache.stratos.autoscaler.exception.PartitionValidationException;
 import org.apache.stratos.autoscaler.registry.RegistryManager;
 import org.apache.stratos.cloud.controller.stub.deployment.partition.Partition;
+import org.apache.stratos.common.constants.StratosConstants;
+import org.wso2.carbon.context.CarbonContext;
+import org.wso2.carbon.context.PrivilegedCarbonContext;
 
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
@@ -44,7 +49,7 @@ public class PartitionManager {
 private static final Log log = LogFactory.getLog(PartitionManager.class);
 	
 	// Partitions against partitionID
-	private static Map<String,Partition> partitions = new HashMap<String, Partition>();
+	private static Map<Integer, Map<String,Partition>> partitions = new HashMap<Integer, Map<String, Partition>>();
 	
 	/*
 	 * Key - network partition id
@@ -64,9 +69,20 @@ private static final Log log = LogFactory.getLog(PartitionManager.class);
         networkPartitionLbHolders = new HashMap<String, NetworkPartitionLbHolder>();
 	}
 	
+    // Checks whether a given tenant's policies have been added to memory model
+    public boolean isTenantPolicyDetailsInInformationModel(int containerId){
+    	return (partitions.containsKey(containerId));
+    }
 	
 	public boolean partitionExist(String partitionId){
-		return partitions.containsKey(partitionId);
+		int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId();
+        if(partitions.containsKey(tenantId)){
+    		return (partitions.get(tenantId)).containsKey(partitionId);
+        }
+        else if(partitions.containsKey(StratosConstants.PUBLIC_DEFINITION)){
+        	return (partitions.get(StratosConstants.PUBLIC_DEFINITION)).containsKey(partitionId);
+        }
+        return false;
 	}
 	
 	/*
@@ -95,25 +111,96 @@ private static final Log log = LogFactory.getLog(PartitionManager.class);
         }
     }
 
+    public void loadPartitionsToInformationModel(){
+    	List<Partition> partitions = RegistryManager.getInstance().retrievePartitions();
+        Iterator<Partition> partitionIterator = partitions.iterator();
+        while (partitionIterator.hasNext()) {
+            Partition partition = partitionIterator.next();
+            try{
+            	addPartitionToInformationModel(partition);
+            }
+            catch(InvalidPolicyException e){
+            	// ignore and move on
+            }
+        }
+    }
+    
+    public void removePartitionsFromInformationModel(int tenantId){
+    	partitions.remove(tenantId);
+    }
+       
+    public void loadNetworkPartitionsToInformationModel(){
+    	List<NetworkPartitionLbHolder> nwPartitionHolders = RegistryManager.getInstance().retrieveNetworkPartitionLbHolders();
+        Iterator<NetworkPartitionLbHolder> nwPartitionIterator = nwPartitionHolders.iterator();
+        while (nwPartitionIterator.hasNext()) {
+            NetworkPartitionLbHolder nwPartition = nwPartitionIterator.next();
+            PartitionManager.getInstance().addNetworkPartitionLbHolder(nwPartition);
+        }
+    }
 
-    public void addPartitionToInformationModel(Partition partition) {
-		partitions.put(partition.getId(), partition);
+    public void addPartitionToInformationModel(Partition partition) throws InvalidPolicyException {
+    	int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId();
+    	        
+        if(partition.getIsPublic()){
+        	addPartitionToSpecificContainer(partition, StratosConstants.PUBLIC_DEFINITION);
+        }
+        else{
+        	addPartitionToSpecificContainer(partition, tenantId);
+        }
 	}
+    
+    private void addPartitionToSpecificContainer(Partition partition, int containerId) throws InvalidPolicyException {
+    	
+    	Map<String, Partition> partitionDefinitions;
+    	if(!partitions.containsKey(containerId))
+    	{
+    		partitionDefinitions = new HashMap<String, Partition>();
+    		partitions.put(containerId, partitionDefinitions);
+    	}
+    	else {
+    		partitionDefinitions = partitions.get(containerId);
+    	}
+    	
+        if (!partitionDefinitions.containsKey(partition.getId())) {
+            if (log.isDebugEnabled()) {
+                log.debug("Adding policy :" + partition.getId());
+            }
+            partitionDefinitions.put(partition.getId(), partition);
+        } else {
+        	String errMsg = "Specified policy [" + partition.getId() + "] already exists";
+        	log.error(errMsg);
+            throw new InvalidPolicyException(errMsg);
+        }
+    }
 
 	public NetworkPartitionLbHolder getNetworkPartitionLbHolder(String networkPartitionId) {
 	    return this.networkPartitionLbHolders.get(networkPartitionId);
 	}
 
     public Partition getPartitionById(String partitionId){
-		if(partitionExist(partitionId))
-			return partitions.get(partitionId);
-		else
-			return null;
+    	int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId();
+        if(partitions.containsKey(tenantId)){
+    		return (partitions.get(tenantId)).get(partitionId);
+        }
+        else if(partitions.containsKey(StratosConstants.PUBLIC_DEFINITION)){
+        	return (partitions.get(StratosConstants.PUBLIC_DEFINITION)).get(partitionId);
+        }
+    	
+    	return null;
 	}
 	
 	public Partition[] getAllPartitions(){
-		return partitions.values().toArray(new Partition[0]);
+		System.out.println("Tenant ID from PartitionManager-getAllAvailablePartitions: "+ CarbonContext.getThreadLocalCarbonContext().getTenantId());
+		List<Partition> policyList = new ArrayList<Partition>();
+    	int t = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId();
+		
+    	if(partitions.containsKey(t))
+    		policyList.addAll(partitions.get(CarbonContext.getThreadLocalCarbonContext().getTenantId()).values());
 		
+    	if(partitions.containsKey(StratosConstants.PUBLIC_DEFINITION))
+		policyList.addAll(partitions.get(StratosConstants.PUBLIC_DEFINITION).values());
+    	
+    	return policyList.toArray(new Partition[0]);
 	}
 	
 	public boolean validatePartitionViaCloudController(Partition partition) throws PartitionValidationException {
@@ -144,7 +231,6 @@ private static final Log log = LogFactory.getLog(PartitionManager.class);
                 addNetworkPartitionLbHolder(networkPartitionLbHolder);
                 RegistryManager.getInstance().persistNetworkPartitionIbHolder(networkPartitionLbHolder);
             }
-
         }
     }
     
@@ -162,7 +248,6 @@ private static final Log log = LogFactory.getLog(PartitionManager.class);
             	log.error(errMsg);
             	throw new AutoScalerException(errMsg);
             }
-
         }
     }
     

http://git-wip-us.apache.org/repos/asf/stratos/blob/27568093/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/policy/PolicyManager.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/policy/PolicyManager.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/policy/PolicyManager.java
index 3c3521a..48b1dd4 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/policy/PolicyManager.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/policy/PolicyManager.java
@@ -19,9 +19,13 @@
 
 package org.apache.stratos.autoscaler.policy;
 
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 
+import org.apache.stratos.common.constants.StratosConstants;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -33,6 +37,7 @@ import org.apache.stratos.autoscaler.partition.PartitionManager;
 import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy;
 import org.apache.stratos.autoscaler.registry.RegistryManager;
 import org.apache.stratos.cloud.controller.stub.deployment.partition.Partition;
+import org.wso2.carbon.context.CarbonContext;
 
 /**
  * Manager class for the purpose of managing Autoscale/Deployment policy definitions.
@@ -41,9 +46,10 @@ public class PolicyManager {
 
     private static final Log log = LogFactory.getLog(PolicyManager.class);
 
-    private static Map<String, AutoscalePolicy> autoscalePolicyListMap = new HashMap<String, AutoscalePolicy>();
+    private static Map<Integer, Map<String, AutoscalePolicy>> autoscalePolicyListMap = new HashMap<Integer, Map<String, AutoscalePolicy>>();
 
-    private static Map<String, DeploymentPolicy> deploymentPolicyListMap = new HashMap<String, DeploymentPolicy>();
+    private static Map<Integer, Map<String, DeploymentPolicy>> deploymentPolicyListMap = new HashMap<Integer, Map<String, DeploymentPolicy>>();
+    
     
     /* An instance of a PolicyManager is created when the class is loaded. 
      * Since the class is loaded only once, it is guaranteed that an object of 
@@ -60,8 +66,59 @@ public class PolicyManager {
     
     private PolicyManager() {
     }
+    
+    /**
+     * Checks and returns whether policies for tenant exist in information model
+     *
+     *@param tenantId
+     *@return
+     */
+    public boolean isTenantPolicyDetailsInInformationModel(int tenantId){
+    	return (autoscalePolicyListMap.containsKey(tenantId) && deploymentPolicyListMap.containsKey(tenantId));
+    }
+    
+    /**
+     * Loads Autoscaling policies to information model
+     *
+     */
+    public void loadASPoliciesToInformationModel() {
+    	List<AutoscalePolicy> asPolicies = RegistryManager.getInstance().retrieveASPolicies();
+        Iterator<AutoscalePolicy> asPolicyIterator = asPolicies.iterator();
+        while (asPolicyIterator.hasNext()) {
+            AutoscalePolicy asPolicy = asPolicyIterator.next();
+	    	try{
+	                addASPolicyToInformationModel(asPolicy);
+	        }
+	    	catch (InvalidPolicyException e){
+	    		// ignore and move onto next
+	    	}
+    	}
+    }
+    
+    /**
+     * Loads Deployment policies to information model
+     *
+     */
+    public void loadDeploymentPoliciesToInformationModel() {
+    	List<DeploymentPolicy> depPolicies = RegistryManager.getInstance().retrieveDeploymentPolicies();
+        Iterator<DeploymentPolicy> depPolicyIterator = depPolicies.iterator();
+        while (depPolicyIterator.hasNext()) {
+            DeploymentPolicy depPolicy = depPolicyIterator.next();
+            try{
+            		addDeploymentPolicyToInformationModel(depPolicy);
+            }
+            catch (InvalidPolicyException e){
+	    		// ignore and move onto next
+	    	}
+        }
+    }
 
-    // Add the policy to information model and persist.
+    /**
+     * Deploys the specified Autoscaling policy - Adds to information model and persists
+     *
+     * @param policy
+     * @throws InvalidPolicyException
+     */
     public boolean deployAutoscalePolicy(AutoscalePolicy policy) throws InvalidPolicyException {
         if(StringUtils.isEmpty(policy.getId())){
             throw new AutoScalerException("AutoScaling policy id can not be empty");
@@ -73,8 +130,146 @@ public class PolicyManager {
         }
         return true;
     }
+    
+    /**
+     * Adds the specified Autoscaling policy to Information model
+     *
+     * @param policy
+     * @throws InvalidPolicyException
+     */
+    public void addASPolicyToInformationModel(AutoscalePolicy asPolicy) throws InvalidPolicyException {
+    	
+    	int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId();
+    	asPolicy.setTenantId(tenantId);
+    	  
+    	if(asPolicy.getIsPublic()){
+        	addASPolicyToSpecificContainer(asPolicy, StratosConstants.PUBLIC_DEFINITION);
+        }
+    	else{
+    		addASPolicyToSpecificContainer(asPolicy, tenantId);
+    	}
+    }
+    
+    private void addASPolicyToSpecificContainer(AutoscalePolicy asPolicy, int containerId) throws InvalidPolicyException {
+    	
+    	Map<String, AutoscalePolicy> policies;
+    	if(!autoscalePolicyListMap.containsKey(containerId))
+    	{
+    		policies = new HashMap<String, AutoscalePolicy>();
+    		autoscalePolicyListMap.put(containerId, policies);
+    	}
+    	else {
+    		policies = autoscalePolicyListMap.get(containerId);
+    	}
+    	
+        if (!policies.containsKey(asPolicy.getId())) {
+            if (log.isDebugEnabled()) {
+                log.debug("Adding policy :" + asPolicy.getId());
+            }
+            policies.put(asPolicy.getId(), asPolicy);
+        } else {
+        	String errMsg = "Specified policy [" + asPolicy.getId() + "] already exists";
+        	log.error(errMsg);
+            throw new InvalidPolicyException(errMsg);
+        }
+    }
+    
+    /**
+     * Removes the specified Autoscaling policy
+     *
+     * @param policy
+     * @throws InvalidPolicyException
+     */
+    public void undeployAutoscalePolicy(String policy) throws InvalidPolicyException {
+    	int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId();
+    	AutoscalePolicy policyToDelete;
+        
+    	// check in public definitions and remove if ownership is correct
+    	if(autoscalePolicyListMap.containsKey(StratosConstants.PUBLIC_DEFINITION)){
+    		if ((autoscalePolicyListMap.get(StratosConstants.PUBLIC_DEFINITION)).containsKey(policy)){
+	            policyToDelete = (autoscalePolicyListMap.get(StratosConstants.PUBLIC_DEFINITION)).get(policy);
+	            if(policyToDelete.getTenantId() == tenantId){
+	            	if (log.isDebugEnabled()) {
+	                    log.debug("Removing policy :" + policy);
+	                }
+	                RegistryManager.getInstance().removeAutoscalerPolicy(policyToDelete);
+	                (autoscalePolicyListMap.get(StratosConstants.PUBLIC_DEFINITION)).remove(policy);
+	                return;
+	    		}
+	        }		
+    	}
+    	
+    	// check in tenant collection and remove
+    	if(autoscalePolicyListMap.containsKey(tenantId)){
+    		if ((autoscalePolicyListMap.get(tenantId)).containsKey(policy)){
+    			policyToDelete = (autoscalePolicyListMap.get(tenantId)).get(policy);
+    			if (log.isDebugEnabled()) {
+	                log.debug("Removing policy :" + policy);
+	            }
+	            RegistryManager.getInstance().removeAutoscalerPolicy(policyToDelete);
+	            (autoscalePolicyListMap.get(tenantId)).remove(policy);
+    		}
+    		else {
+                throw new InvalidPolicyException("No such policy [" + policy + "] exists");
+    		}
+        } 
+    	else {
+            throw new InvalidPolicyException("No such policy [" + policy + "] exists");
+        }
+    }
+    
+    /**
+     * Returns an array of the Autoscaling policies contained in this manager.
+     *
+     * @return
+     */
+    public AutoscalePolicy[] getAutoscalePolicyList() {        
+    	List<AutoscalePolicy> policyList = new ArrayList<AutoscalePolicy>();
+    	int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId();
+    	
+    	if(autoscalePolicyListMap.containsKey(tenantId))
+    		policyList.addAll(autoscalePolicyListMap.get(tenantId).values());
+		
+    	if(autoscalePolicyListMap.containsKey(StratosConstants.PUBLIC_DEFINITION))
+    		policyList.addAll(autoscalePolicyListMap.get(StratosConstants.PUBLIC_DEFINITION).values());
+    	
+    	return policyList.toArray(new AutoscalePolicy[0]);
+    }
 
-    // Add the deployment policy to information model and persist.
+    /**
+     * Returns the Autoscaling policy to which the specified id is mapped or null
+     *
+     * @param id
+     * @return
+     */
+    public AutoscalePolicy getAutoscalePolicy(String id) {
+    	int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId();
+        if(autoscalePolicyListMap.containsKey(tenantId)){
+    		return (autoscalePolicyListMap.get(tenantId)).get(id);
+        }
+        else if(autoscalePolicyListMap.containsKey(StratosConstants.PUBLIC_DEFINITION)){
+        	return (autoscalePolicyListMap.get(StratosConstants.PUBLIC_DEFINITION)).get(id);
+        }
+    	
+    	return null;
+    }
+    
+    /**
+     * Deletes the Autoscaling policies for specified tenantId or null
+     *
+     * @param tenantId
+     * @return
+     */
+    public void removeASPoliciesFromInformationModel(int tenantId){
+    	autoscalePolicyListMap.remove(tenantId);
+    }
+    
+    /**
+     * Deploys the specified Deployment policy - Adds to information model and persists
+     *
+     * @param policy
+     * @throws InvalidPolicyException
+     */
     public boolean deployDeploymentPolicy(DeploymentPolicy policy) throws InvalidPolicyException {
         if(StringUtils.isEmpty(policy.getId())){
             throw new AutoScalerException("Deploying policy id can not be empty");
@@ -97,6 +292,49 @@ public class PolicyManager {
         }
         return true;
     }
+    
+    /**
+     * Adds the specified Deployment policy to Information model
+     *
+     * @param policy
+     * @throws InvalidPolicyException
+     */
+    public void addDeploymentPolicyToInformationModel(DeploymentPolicy policy) throws InvalidPolicyException {
+    	int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId();
+    	policy.setTenantId(tenantId);
+    	
+        if(policy.getIsPublic()){
+        	addDeploymentPolicyToSpecificContainer(policy, StratosConstants.PUBLIC_DEFINITION);
+        }
+        else{
+        	addDeploymentPolicyToSpecificContainer(policy, tenantId);
+        }
+    }
+    
+    private void addDeploymentPolicyToSpecificContainer(DeploymentPolicy deploymentPolicy, int containerId) throws InvalidPolicyException {
+    	
+    	Map<String, DeploymentPolicy> policies;
+    	if(!deploymentPolicyListMap.containsKey(containerId))
+    	{
+    		policies = new HashMap<String, DeploymentPolicy>();
+    		deploymentPolicyListMap.put(containerId, policies);
+    	}
+    	else {
+    		policies = deploymentPolicyListMap.get(containerId);
+    	}
+    	
+        if (!policies.containsKey(deploymentPolicy.getId())) {
+            if (log.isDebugEnabled()) {
+                log.debug("Adding policy :" + deploymentPolicy.getId());
+            }
+            policies.put(deploymentPolicy.getId(), deploymentPolicy);
+        } else {
+        	String errMsg = "Specified policy [" + deploymentPolicy.getId() + "] already exists";
+        	log.error(errMsg);
+            throw new InvalidPolicyException(errMsg);
+        }
+    }
+
 
     private void fillPartitions(DeploymentPolicy deploymentPolicy) throws InvalidPartitionException {
         PartitionManager partitionMgr = PartitionManager.getInstance();
@@ -127,111 +365,98 @@ public class PolicyManager {
         destPartition.setProperties(srcPartition.getProperties());
     }
 
-    public void addASPolicyToInformationModel(AutoscalePolicy asPolicy) throws InvalidPolicyException {
-        if (!autoscalePolicyListMap.containsKey(asPolicy.getId())) {
-            if (log.isDebugEnabled()) {
-                log.debug("Adding policy :" + asPolicy.getId());
-            }
-            autoscalePolicyListMap.put(asPolicy.getId(), asPolicy);
-        } else {
-        	String errMsg = "Specified policy [" + asPolicy.getId() + "] already exists";
-        	log.error(errMsg);
-            throw new InvalidPolicyException(errMsg);
-        }
-    }
-
     /**
-     * Removes the specified policy
+     * Removes the specified Deployment policy
      *
      * @param policy
      * @throws InvalidPolicyException
      */
-    public void undeployAutoscalePolicy(String policy) throws InvalidPolicyException {
-        if (autoscalePolicyListMap.containsKey(policy)) {
-            if (log.isDebugEnabled()) {
-                log.debug("Removing policy :" + policy);
-            }
-            autoscalePolicyListMap.remove(policy);
-            RegistryManager.getInstance().removeAutoscalerPolicy(this.getAutoscalePolicy(policy));
-        } else {
+    public void undeployDeploymentPolicy(String policy) throws InvalidPolicyException {
+    	int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId();
+    	DeploymentPolicy policyToDelete;
+        
+    	// check in public definitions and remove if ownership is correct
+    	if(deploymentPolicyListMap.containsKey(StratosConstants.PUBLIC_DEFINITION)){
+    		if ((deploymentPolicyListMap.get(StratosConstants.PUBLIC_DEFINITION)).containsKey(policy)){
+	            policyToDelete = (deploymentPolicyListMap.get(StratosConstants.PUBLIC_DEFINITION)).get(policy);
+	            if(policyToDelete.getTenantId() == tenantId){
+	            	if (log.isDebugEnabled()) {
+	                    log.debug("Removing policy :" + policy);
+	                }
+	            	// undeploy network partitions this deployment policy.
+		            PartitionManager.getInstance().undeployNetworkPartitions(policyToDelete);
+	                RegistryManager.getInstance().removeDeploymentPolicy(policyToDelete);
+	                (deploymentPolicyListMap.get(StratosConstants.PUBLIC_DEFINITION)).remove(policy);
+	                return;
+	    		}
+	        }		
+    	}
+    	
+    	// check in tenant collection and remove
+    	if(deploymentPolicyListMap.containsKey(tenantId)){
+    		if ((deploymentPolicyListMap.get(tenantId)).containsKey(policy)){
+    			policyToDelete = (deploymentPolicyListMap.get(tenantId)).get(policy);
+    			if (log.isDebugEnabled()) {
+	                log.debug("Removing policy :" + policy);
+	            }
+    			// undeploy network partitions this deployment policy.
+	            PartitionManager.getInstance().undeployNetworkPartitions(policyToDelete);
+	            RegistryManager.getInstance().removeDeploymentPolicy(policyToDelete);
+	            (deploymentPolicyListMap.get(tenantId)).remove(policy);
+    		}
+    		else {
+                throw new InvalidPolicyException("No such policy [" + policy + "] exists");
+    		}
+        } 
+    	else {
             throw new InvalidPolicyException("No such policy [" + policy + "] exists");
         }
     }
 
     /**
-     * Returns an array of the Autoscale policies contained in this manager.
+     * Returns an array of the Deployment policies contained in this manager.
      *
      * @return
      */
-    public AutoscalePolicy[] getAutoscalePolicyList() {        
-        return autoscalePolicyListMap.values().toArray(new AutoscalePolicy[0]);
+    public DeploymentPolicy[] getDeploymentPolicyList() {        
+    	List<DeploymentPolicy> policyList = new ArrayList<DeploymentPolicy>();
+    	int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId();
+    	
+    	if(deploymentPolicyListMap.containsKey(tenantId))
+    			policyList.addAll(deploymentPolicyListMap.get(CarbonContext.getThreadLocalCarbonContext().getTenantId()).values());
+		
+    	if(deploymentPolicyListMap.containsKey(StratosConstants.PUBLIC_DEFINITION))
+    			policyList.addAll(deploymentPolicyListMap.get(StratosConstants.PUBLIC_DEFINITION).values());
+    	
+    	return policyList.toArray(new DeploymentPolicy[0]);
     }
 
     /**
-     * Returns the autoscale policy to which the specified id is mapped or null
+     * Returns the deployment policy to which the specified id is mapped or null
      *
      * @param id
      * @return
      */
-    public AutoscalePolicy getAutoscalePolicy(String id) {
-        return autoscalePolicyListMap.get(id);
-    }
-
-    // Add the deployment policy to As in memmory information model. Does not persist.
-    public void addDeploymentPolicyToInformationModel(DeploymentPolicy policy) throws InvalidPolicyException {
-        if (!deploymentPolicyListMap.containsKey(policy.getId())) {
-            if (log.isDebugEnabled()) {
-                log.debug("Adding policy :" + policy.getId());
-            }
-            PartitionManager.getInstance().deployNewNetworkPartitions(policy);
-            deploymentPolicyListMap.put(policy.getId(), policy);
-        } else {
-        	String errMsg = "Specified policy [" + policy.getId()+ "] already exists";
-        	log.error(errMsg);
-            throw new InvalidPolicyException(errMsg);
+    public DeploymentPolicy getDeploymentPolicy(String id) {
+    	int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId();
+        if(deploymentPolicyListMap.containsKey(tenantId)){
+    		return (deploymentPolicyListMap.get(tenantId)).get(id);
         }
-    }
-
-    /**
-     * Removes the specified policy
-     *
-     * @param policy
-     * @throws InvalidPolicyException
-     */
-    public void undeployDeploymentPolicy(String policy) throws InvalidPolicyException {
-        if (deploymentPolicyListMap.containsKey(policy)) {
-            if (log.isDebugEnabled()) {
-                log.debug("Removing deployment policy :" + policy);
-            }
-            DeploymentPolicy depPolicy = this.getDeploymentPolicy(policy);
-            // undeploy network partitions this deployment policy.
-            PartitionManager.getInstance().undeployNetworkPartitions(depPolicy);
-            // undeploy the deployment policy.
-            RegistryManager.getInstance().removeDeploymentPolicy(depPolicy);
-            // remove from the infromation model.
-            deploymentPolicyListMap.remove(policy);
-        } else {
-            throw new InvalidPolicyException("No such policy [" + policy + "] exists");
+        else if(deploymentPolicyListMap.containsKey(StratosConstants.PUBLIC_DEFINITION)){
+        	return (deploymentPolicyListMap.get(StratosConstants.PUBLIC_DEFINITION)).get(id);
         }
+    	
+    	return null;
     }
-
-    /**
-     * Returns an array of the Deployment policies contained in this manager.
-     *
-     * @return
-     */
-    public DeploymentPolicy[] getDeploymentPolicyList() {        
-        return deploymentPolicyListMap.values().toArray(new DeploymentPolicy[0]);
-    }
-
+    
     /**
-     * Returns the deployment policy to which the specified id is mapped or null
+     * Deletes the policies for specified tenantId or null
      *
-     * @param id
+     * @param tenantId
      * @return
      */
-    public DeploymentPolicy getDeploymentPolicy(String id) {
-        return deploymentPolicyListMap.get(id);
+    public void removeDeploymentPoliciesFromInformationModel(int tenantId){
+    	deploymentPolicyListMap.remove(tenantId);
     }
 
 }