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); } }
