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 <[email protected]>
Authored: Fri Sep 19 16:07:01 2014 +0530
Committer: Shiro <[email protected]>
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);
     }
 
 }

Reply via email to