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