Repository: stratos Updated Branches: refs/heads/master 7372d0376 -> f2f888b7f
implementing app bursting pattern in one-after-another algorithm Project: http://git-wip-us.apache.org/repos/asf/stratos/repo Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/ab63a4bb Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/ab63a4bb Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/ab63a4bb Branch: refs/heads/master Commit: ab63a4bb55150c074448f053a5580394b9d1579a Parents: 7372d03 Author: R-Rajkumar <[email protected]> Authored: Mon Mar 9 12:08:37 2015 +0530 Committer: R-Rajkumar <[email protected]> Committed: Mon Mar 9 12:08:37 2015 +0530 ---------------------------------------------------------------------- .../OneAfterAnotherAlgorithm.java | 56 +++++++++++++++++++- .../policy/deployment/ApplicationPolicy.java | 10 ++++ .../stratos/autoscaler/util/AutoscalerUtil.java | 38 +++++++++++++ .../common/constants/StratosConstants.java | 3 ++ 4 files changed, 106 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/stratos/blob/ab63a4bb/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithms/networkpartition/OneAfterAnotherAlgorithm.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithms/networkpartition/OneAfterAnotherAlgorithm.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithms/networkpartition/OneAfterAnotherAlgorithm.java index e75f709..aa6a044 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithms/networkpartition/OneAfterAnotherAlgorithm.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithms/networkpartition/OneAfterAnotherAlgorithm.java @@ -25,6 +25,9 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.stratos.autoscaler.algorithms.NetworkPartitionAlgorithm; import org.apache.stratos.autoscaler.pojo.policy.deployment.ApplicationPolicy; +import org.apache.stratos.common.constants.StratosConstants; + +import edu.emory.mathcs.backport.java.util.Arrays; public class OneAfterAnotherAlgorithm implements NetworkPartitionAlgorithm{ @@ -59,8 +62,59 @@ public class OneAfterAnotherAlgorithm implements NetworkPartitionAlgorithm{ return null; } - String[] networkPartitions = applicationPolicy.getNetworkPartitions(); String applicatioinPolicyId = applicationPolicy.getId(); + String[] networkPartitionGroups = applicationPolicy.getNetworkPartitionGroups(); + if (networkPartitionGroups != null && networkPartitionGroups.length != 0) { + if (log.isDebugEnabled()) { + String msg = String.format("Network partition groups property found in application policy [application-id] %s [application-policy-id] %s. " + + "Hence using network partition groups for app bursting", applicationId, applicatioinPolicyId); + log.debug(msg); + } + int totalNetworkPartitionGroups = networkPartitionGroups.length; + if (log.isDebugEnabled()) { + String msg = String.format("%s network partition groups found in application policy [application-id] %s [application-policy-id] %s", + totalNetworkPartitionGroups, applicationId, applicatioinPolicyId); + log.debug(msg); + } + + int currentPartitionIndex = networkPartitionAlgorithmContext.getCurrentNetworkPartitionIndex().intValue(); + if (log.isDebugEnabled()) { + String msg = String.format("Current network partition group index is %s [application-id] %s [application-policy-d]", + currentPartitionIndex, applicationId, applicatioinPolicyId); + log.debug(msg); + } + + if (currentPartitionIndex >= totalNetworkPartitionGroups) { + if (log.isDebugEnabled()) { + String msg = String.format("currentPartitionIndex >= totalNetworkPartitionGroups, hence no more network partition groups are available " + + "[application-id] %s [application-policy-d]", currentPartitionIndex, applicationId, applicatioinPolicyId); + log.debug(msg); + } + return null; + } + + int selectedIndex = networkPartitionAlgorithmContext.getCurrentNetworkPartitionIndex().incrementAndGet(); + if (log.isDebugEnabled()) { + String msg = String.format("Selected network partition group index is %s (starting from 1,2,3...) [application-id] %s [application-policy-d]", + selectedIndex, applicationId, applicatioinPolicyId); + log.debug(msg); + } + + if (log.isDebugEnabled()) { + String msg = String.format("Selected network partition group is %s [application-id] %s [application-policy-d]", + networkPartitionGroups[selectedIndex-1], applicationId, applicatioinPolicyId); + log.debug(msg); + } + + String[] selectedNetworkPartitions = networkPartitionGroups[selectedIndex-1].split(StratosConstants.APPLICATION_POLICY_NETWORK_PARTITIONS_SPLITTER); + if (selectedNetworkPartitions == null) { + return null; + } + + return Arrays.asList(selectedNetworkPartitions); + } + + String[] networkPartitions = applicationPolicy.getNetworkPartitions(); if (networkPartitions == null || networkPartitions.length == 0) { if (log.isWarnEnabled()) { String msg = String.format("Network partitions found in application policy [application-id] %s [application-policy-id] %s", http://git-wip-us.apache.org/repos/asf/stratos/blob/ab63a4bb/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/deployment/ApplicationPolicy.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/deployment/ApplicationPolicy.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/deployment/ApplicationPolicy.java index 1f52d60..ac3143f 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/deployment/ApplicationPolicy.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/deployment/ApplicationPolicy.java @@ -29,6 +29,8 @@ public class ApplicationPolicy implements Serializable{ private String algorithm; private String[] networkPartitions; private Properties properties; + // if networkPartitionGroups property is set, we are populating following variable. + private String[] networkPartitionGroups; public String getId() { return id; @@ -61,4 +63,12 @@ public class ApplicationPolicy implements Serializable{ public void setProperties(Properties properties) { this.properties = properties; } + + public String[] getNetworkPartitionGroups() { + return networkPartitionGroups; + } + + public void setNetworkPartitionGroups(String[] networkPartitionGroups) { + this.networkPartitionGroups = networkPartitionGroups; + } } http://git-wip-us.apache.org/repos/asf/stratos/blob/ab63a4bb/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java index 73916f7..eb11772 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java @@ -646,6 +646,44 @@ public class AutoscalerUtil { } } + + // if networkPartitionGroups property is set, we need to validate that too + Properties properties = applicationPolicy.getProperties(); + if (properties!= null) { + Property networkPartitionGroupsProperty = properties.getProperty(StratosConstants.APPLICATION_POLICY_NETWORK_PARTITION_GROUPS); + if (networkPartitionGroupsProperty != null) { + String networkPartitionGroupsPropertyValue = networkPartitionGroupsProperty.getValue(); + if (networkPartitionGroupsPropertyValue != null) { + String[] networkPartitionGroups = networkPartitionGroupsPropertyValue.split(StratosConstants.APPLICATION_POLICY_NETWORK_PARTITION_GROUPS_SPLITTER); + if (networkPartitionGroups != null) { + for (String networkPartitionIdsString : networkPartitionGroups) { + networkPartitionIds = networkPartitionIdsString.split(StratosConstants.APPLICATION_POLICY_NETWORK_PARTITIONS_SPLITTER); + if (networkPartitionIds != null) { + for (String networkPartitionId : networkPartitionIds) { + // network-partition-id can't be null or empty + if (null == networkPartitionId || networkPartitionId.isEmpty()) { + String msg = String.format("Invalid Application Policy. " + + "Cause -> Invalid network-partition-id : %s", networkPartitionId); + log.error(msg); + throw new InvalidApplicationPolicyException(msg); + } + + // network partitions should be added already + if (null == CloudControllerServiceClient.getInstance().getNetworkPartition(networkPartitionId)) { + String msg = String.format("Invalid Application Policy. " + + "Cause -> Network partition not found for network-partition-id : %s", networkPartitionId); + log.error(msg); + throw new InvalidApplicationPolicyException(msg); + } + } + } + } + // populating network partition groups in application policy + applicationPolicy.setNetworkPartitionGroups(networkPartitionGroups); + } + } + } + } } http://git-wip-us.apache.org/repos/asf/stratos/blob/ab63a4bb/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/constants/StratosConstants.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/constants/StratosConstants.java b/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/constants/StratosConstants.java index 01a9dc7..67f46cb 100644 --- a/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/constants/StratosConstants.java +++ b/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/constants/StratosConstants.java @@ -201,5 +201,8 @@ public class StratosConstants { // network partition algorithm id constants public static final String NETWORK_PARTITION_ONE_AFTER_ANOTHER_ALGORITHM_ID = "one-after-another"; public static final String NETWORK_PARTITION_ALL_AT_ONCE_ALGORITHM_ID = "all-at-once"; + public static final String APPLICATION_POLICY_NETWORK_PARTITION_GROUPS = "networkPartitionGroups"; + public static final String APPLICATION_POLICY_NETWORK_PARTITIONS_SPLITTER = "\\|"; + public static final String APPLICATION_POLICY_NETWORK_PARTITION_GROUPS_SPLITTER = ","; }
