You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by re...@apache.org on 2014/12/05 14:40:31 UTC
[5/5] stratos git commit: fixing group level deployment policy
parsing and improving processors
fixing group level deployment policy parsing and improving processors
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/3bd20e5e
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/3bd20e5e
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/3bd20e5e
Branch: refs/heads/master
Commit: 3bd20e5ee2a4479a8953df6c6e62e478b8ebd672
Parents: cf1b372
Author: reka <rt...@gmail.com>
Authored: Fri Dec 5 19:09:56 2014 +0530
Committer: reka <rt...@gmail.com>
Committed: Fri Dec 5 19:09:56 2014 +0530
----------------------------------------------------------------------
.../autoscaler/api/AutoScalerServiceImpl.java | 1 +
.../context/cluster/VMClusterContext.java | 43 +--
.../ClusterLevelNetworkPartitionContext.java | 10 +-
.../GroupLevelNetworkPartitionContext.java | 85 +++-
.../AutoscalerTopologyEventReceiver.java | 162 ++++----
.../autoscaler/monitor/MonitorFactory.java | 22 +-
.../monitor/component/GroupMonitor.java | 384 +++++++++----------
.../component/ParentComponentMonitor.java | 21 +-
.../policy/deployment/DeploymentPolicy.java | 14 -
.../cluster/ClusterStatusActiveProcessor.java | 1 +
.../cluster/ClusterStatusInActiveProcessor.java | 8 +-
.../group/GroupStatusInActiveProcessor.java | 1 +
.../application/beans/GroupDefinition.java | 2 +-
.../domain/instance/ClusterInstance.java | 11 -
.../domain/instance/GroupInstance.java | 8 -
.../messaging/domain/instance/Instance.java | 11 +
.../ApplicationsMessageProcessorChain.java | 6 +
.../rest/endpoint/api/StratosApiV41.java | 2 +-
18 files changed, 406 insertions(+), 386 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/stratos/blob/3bd20e5e/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java
index bd98a76..64016fc 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java
@@ -190,6 +190,7 @@ public class AutoScalerServiceImpl implements AutoScalerServiceInterface {
}
} catch (PartitionValidationException e) {
log.error("Error while validating the deployment policy", e);
+ //TODO throw exception
} finally {
ApplicationHolder.releaseReadLock();
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/3bd20e5e/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/VMClusterContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/VMClusterContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/VMClusterContext.java
index 2f83178..f506596 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/VMClusterContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/VMClusterContext.java
@@ -21,7 +21,6 @@ package org.apache.stratos.autoscaler.context.cluster;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.stratos.autoscaler.applications.ApplicationHolder;
-import org.apache.stratos.autoscaler.client.CloudControllerClient;
import org.apache.stratos.autoscaler.context.member.MemberStatsContext;
import org.apache.stratos.autoscaler.context.partition.ClusterLevelPartitionContext;
import org.apache.stratos.autoscaler.context.partition.network.ClusterLevelNetworkPartitionContext;
@@ -131,7 +130,7 @@ public class VMClusterContext extends AbstractClusterContext {
networkPartitionContext = this.networkPartitionCtxts.get(
clusterInstance.getNetworkPartitionId());
} else {
- if(policy != null) {
+ if (policy != null) {
ChildLevelNetworkPartition networkPartition = policy.
getChildLevelNetworkPartition(clusterInstance.getNetworkPartitionId());
networkPartitionContext = new ClusterLevelNetworkPartitionContext(networkPartition.getId(),
@@ -139,9 +138,7 @@ public class VMClusterContext extends AbstractClusterContext {
} else {
//Parent should have the partition specified
networkPartitionContext = new ClusterLevelNetworkPartitionContext(
- clusterInstance.getNetworkPartitionId(),
- null,
- 0);
+ clusterInstance.getNetworkPartitionId());
}
}
@@ -149,7 +146,7 @@ public class VMClusterContext extends AbstractClusterContext {
if (clusterInstance.getPartitionId() != null) {
//Need to add partition Context based on the given one from the parent
networkPartitionContext = addPartition(clusterInstance, cluster,
- networkPartitionContext, null);
+ networkPartitionContext, null);
} else {
networkPartitionContext = parseDeploymentPolicy(clusterInstance, cluster,
policy, networkPartitionContext);
@@ -159,7 +156,7 @@ public class VMClusterContext extends AbstractClusterContext {
networkPartitionContext);
if (log.isInfoEnabled()) {
log.info(String.format("Cluster instance context has been added to network partition, [cluster instance]" +
- " %s [network partition] %s", clusterInstance.getInstanceId(),
+ " %s [network partition] %s", clusterInstance.getInstanceId(),
clusterInstance.getNetworkPartitionId()));
}
}
@@ -178,7 +175,7 @@ public class VMClusterContext extends AbstractClusterContext {
log.error(msg);
throw new PolicyValidationException(msg);
}
-
+
if (log.isDebugEnabled()) {
log.debug("Deployment policy name: " + childPolicy.getId());
}
@@ -198,12 +195,12 @@ public class VMClusterContext extends AbstractClusterContext {
//Retrieving the ChildLevelNetworkPartition and create NP Context
ChildLevelNetworkPartition networkPartition;
networkPartition = childPolicy.
- getChildLevelNetworkPartition(clusterInstance.getNetworkPartitionId());
+ getChildLevelNetworkPartition(clusterInstance.getNetworkPartitionId());
if (clusterLevelNetworkPartitionContext == null) {
clusterLevelNetworkPartitionContext = new ClusterLevelNetworkPartitionContext(
- networkPartition.getId(),
- networkPartition.getPartitionAlgo(),
- networkPartition.getMin());
+ networkPartition.getId(),
+ networkPartition.getPartitionAlgo(),
+ networkPartition.getMin());
}
//Fill cluster instance context with child level partitions
@@ -240,7 +237,7 @@ public class VMClusterContext extends AbstractClusterContext {
}
ClusterInstanceContext clusterInstanceContext = clusterLevelNetworkPartitionContext.
- getClusterInstanceContext(clusterInstance.getInstanceId());
+ getClusterInstanceContext(clusterInstance.getInstanceId());
int maxInstances = 1;
if (clusterInstanceContext == null) {
int minInstances = 1;
@@ -248,7 +245,8 @@ public class VMClusterContext extends AbstractClusterContext {
try {
Application application = ApplicationHolder.getApplications().
getApplication(cluster.getAppId());
- ClusterDataHolder dataHolder = application.getClusterData(AutoscalerUtil.getAliasFromClusterId(clusterId));
+ ClusterDataHolder dataHolder = application.
+ getClusterData(AutoscalerUtil.getAliasFromClusterId(clusterId));
minInstances = dataHolder.getMinInstances();
maxInstances = dataHolder.getMaxInstances();
} finally {
@@ -256,10 +254,10 @@ public class VMClusterContext extends AbstractClusterContext {
}
clusterInstanceContext = new ClusterInstanceContext(clusterInstance.getInstanceId(),
clusterLevelNetworkPartitionContext.getPartitionAlgorithm(),
- minInstances, maxInstances , nPartitionId);
+ minInstances, maxInstances, nPartitionId);
}
String partitionId;
- if(childLevelPartition != null) {
+ if (childLevelPartition != null) {
//use it own defined partition
partitionId = childLevelPartition.getPartitionId();
maxInstances = childLevelPartition.getMax();
@@ -269,18 +267,19 @@ public class VMClusterContext extends AbstractClusterContext {
}
//Retrieving the actual partition from application
Partition appPartition = deploymentPolicy.getApplicationLevelNetworkPartition(nPartitionId).
- getPartition(partitionId);
+ getPartition(partitionId);
org.apache.stratos.cloud.controller.stub.domain.Partition partition =
convertTOCCPartition(appPartition);
//Validate the partition
- CloudControllerClient.getInstance().validatePartition(partition);
+ //TODO validate partition removal
+ //CloudControllerClient.getInstance().validatePartition(partition);
//Creating cluster level partition context
ClusterLevelPartitionContext clusterLevelPartitionContext = new ClusterLevelPartitionContext(
- maxInstances,
- partition,
- clusterInstance.getNetworkPartitionId());
+ maxInstances,
+ partition,
+ clusterInstance.getNetworkPartitionId());
clusterLevelPartitionContext.setServiceName(cluster.getServiceName());
clusterLevelPartitionContext.setProperties(cluster.getProperties());
@@ -302,8 +301,6 @@ public class VMClusterContext extends AbstractClusterContext {
}
-
-
return clusterLevelNetworkPartitionContext;
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/3bd20e5e/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/ClusterLevelNetworkPartitionContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/ClusterLevelNetworkPartitionContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/ClusterLevelNetworkPartitionContext.java
index 036228d..bb00c2b 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/ClusterLevelNetworkPartitionContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/ClusterLevelNetworkPartitionContext.java
@@ -36,23 +36,25 @@ public class ClusterLevelNetworkPartitionContext extends NetworkPartitionContext
private static final long serialVersionUID = 572769304374110159L;
private final String id;
- private final String partitionAlgorithm;
+ private String partitionAlgorithm;
private int min;
private Map<String, ClusterInstanceContext> instanceIdToClusterInstanceContextMap;
public ClusterLevelNetworkPartitionContext(String id, String partitionAlgorithm, int min) {
-
- //super(id, partitionAlgo, partitions);
this.id = id;
this.partitionAlgorithm = partitionAlgorithm;
this.min = min;
-
setInstanceIdToClusterInstanceContextMap(new HashMap<String, ClusterInstanceContext>());
}
+ public ClusterLevelNetworkPartitionContext(String id) {
+ this.id = id;
+ setInstanceIdToClusterInstanceContextMap(new HashMap<String, ClusterInstanceContext>());
+ }
+
public int hashCode() {
http://git-wip-us.apache.org/repos/asf/stratos/blob/3bd20e5e/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/GroupLevelNetworkPartitionContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/GroupLevelNetworkPartitionContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/GroupLevelNetworkPartitionContext.java
index 402bbfa..3ffe6d3 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/GroupLevelNetworkPartitionContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/GroupLevelNetworkPartitionContext.java
@@ -21,16 +21,16 @@ package org.apache.stratos.autoscaler.context.partition.network;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.stratos.autoscaler.context.group.GroupInstanceContext;
-import org.apache.stratos.autoscaler.context.partition.ClusterLevelPartitionContext;
import org.apache.stratos.autoscaler.context.partition.GroupLevelPartitionContext;
-import org.apache.stratos.cloud.controller.stub.domain.Partition;
import java.io.Serializable;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
/**
* Holds runtime data of a network partition.
- *
*/
public class GroupLevelNetworkPartitionContext extends NetworkPartitionContext implements Serializable {
private static final Log log = LogFactory.getLog(GroupLevelNetworkPartitionContext.class);
@@ -42,9 +42,10 @@ public class GroupLevelNetworkPartitionContext extends NetworkPartitionContext i
private int requiredInstanceCountBasedOnStats;
private int requiredInstanceCountBasedOnDependencies;
- private final String partitionAlgorithm;
+ private String partitionAlgorithm;
- private final Partition[] partitions;
+ //Group level partition contexts
+ private List<GroupLevelPartitionContext> partitionContexts;
//details required for partition selection algorithms
private int currentPartitionIndex;
@@ -52,18 +53,10 @@ public class GroupLevelNetworkPartitionContext extends NetworkPartitionContext i
//group instances kept inside a partition
private Map<String, GroupInstanceContext> instanceIdToInstanceContextMap;
- public GroupLevelNetworkPartitionContext(String id, String partitionAlgo, Partition[] partitions) {
+ public GroupLevelNetworkPartitionContext(String id, String partitionAlgo) {
this.id = id;
this.partitionAlgorithm = partitionAlgo;
- if (partitions == null) {
- this.partitions = new Partition[0];
- } else {
- this.partitions = Arrays.copyOf(partitions, partitions.length);
- }
- for (Partition partition : partitions) {
- minInstanceCount += partition.getPartitionMin();
- maxInstanceCount += partition.getPartitionMax();
- }
+ partitionContexts = new ArrayList<GroupLevelPartitionContext>();
requiredInstanceCountBasedOnStats = minInstanceCount;
requiredInstanceCountBasedOnDependencies = minInstanceCount;
instanceIdToInstanceContextMap = new HashMap<String, GroupInstanceContext>();
@@ -71,6 +64,14 @@ public class GroupLevelNetworkPartitionContext extends NetworkPartitionContext i
}
+ public GroupLevelNetworkPartitionContext(String id) {
+ this.id = id;
+ partitionContexts = new ArrayList<GroupLevelPartitionContext>();
+ requiredInstanceCountBasedOnStats = minInstanceCount;
+ requiredInstanceCountBasedOnDependencies = minInstanceCount;
+ instanceIdToInstanceContextMap = new HashMap<String, GroupInstanceContext>();
+ }
+
public Map<String, GroupInstanceContext> getInstanceIdToInstanceContextMap() {
return instanceIdToInstanceContextMap;
}
@@ -150,15 +151,10 @@ public class GroupLevelNetworkPartitionContext extends NetworkPartitionContext i
}
-
public String getPartitionAlgorithm() {
return partitionAlgorithm;
}
- public Partition[] getPartitions() {
- return partitions;
- }
-
public int getScaleDownRequestsCount() {
return scaleDownRequestsCount;
}
@@ -187,6 +183,53 @@ public class GroupLevelNetworkPartitionContext extends NetworkPartitionContext i
this.requiredInstanceCountBasedOnDependencies = requiredInstanceCountBasedOnDependencies;
}
+ public List<GroupLevelPartitionContext> getPartitionCtxts() {
+
+ return partitionContexts;
+ }
+
+ public GroupLevelPartitionContext getPartitionCtxt(String partitionId) {
+
+ for (GroupLevelPartitionContext partitionContext : partitionContexts) {
+ if (partitionContext.getPartitionId().equals(partitionId)) {
+ return partitionContext;
+ }
+ }
+ return null;
+ }
+
+ public void addPartitionContext(GroupLevelPartitionContext partitionContext) {
+ partitionContexts.add(partitionContext);
+ }
+
+ public int getNonTerminatedMemberCountOfPartition(String partitionId) {
+
+ for (GroupLevelPartitionContext partitionContext : partitionContexts) {
+ if (partitionContext.getPartitionId().equals(partitionId)) {
+ return partitionContext.getNonTerminatedInstanceCount();
+ }
+ }
+ return 0;
+ }
+
+ public int getActiveMemberCount(String currentPartitionId) {
+
+ for (GroupLevelPartitionContext partitionContext : partitionContexts) {
+ if (partitionContext.getPartitionId().equals(currentPartitionId)) {
+ return partitionContext.getActiveInstanceCount();
+ }
+ }
+ return 0;
+ }
+
+ public GroupLevelPartitionContext getPartitionContextById(String partitionId) {
+ for (GroupLevelPartitionContext partitionContext : partitionContexts) {
+ if (partitionContext.getPartitionId().equals(partitionId)) {
+ return partitionContext;
+ }
+ }
+ return null;
+ }
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/3bd20e5e/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/event/receiver/topology/AutoscalerTopologyEventReceiver.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/event/receiver/topology/AutoscalerTopologyEventReceiver.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/event/receiver/topology/AutoscalerTopologyEventReceiver.java
index e1357f5..e007a3f 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/event/receiver/topology/AutoscalerTopologyEventReceiver.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/event/receiver/topology/AutoscalerTopologyEventReceiver.java
@@ -412,87 +412,87 @@ public class AutoscalerTopologyEventReceiver {
});
topologyEventReceiver.addEventListener(new ClusterInstanceCreatedEventListener() {
- @Override
- protected void onEvent(Event event) {
-
- ClusterInstanceCreatedEvent clusterInstanceCreatedEvent =
- (ClusterInstanceCreatedEvent) event;
- AbstractClusterMonitor clusterMonitor = AutoscalerContext.getInstance().
- getClusterMonitor(clusterInstanceCreatedEvent.getClusterId());
- String instanceId = ((ClusterInstanceCreatedEvent) event).getInstanceId();
- //FIXME to take lock when clusterMonitor is running
- if (clusterMonitor != null) {
- TopologyManager.acquireReadLockForCluster(clusterInstanceCreatedEvent.getServiceName(),
- clusterInstanceCreatedEvent.getClusterId());
-
- try {
- Service service = TopologyManager.getTopology().
- getService(clusterInstanceCreatedEvent.getServiceName());
-
- if (service != null) {
- Cluster cluster = service.getCluster(clusterInstanceCreatedEvent.getClusterId());
- if (cluster != null) {
- try {
- if (cluster.isKubernetesCluster()) {
- clusterMonitor.setClusterContext(
- ClusterContextFactory.getKubernetesClusterContext(
- instanceId,
- cluster));
- } else {
- VMClusterContext clusterContext =
- (VMClusterContext) clusterMonitor.getClusterContext();
- if (clusterContext == null) {
- clusterContext = ClusterContextFactory.
- getVMClusterContext(instanceId,
- cluster);
- clusterMonitor.setClusterContext(clusterContext);
-
- }
- clusterContext.addInstanceContext(instanceId, cluster);
- if (clusterMonitor.getInstance(instanceId) == null) {
- ClusterInstance clusterInstance = cluster.
- getInstanceContexts(instanceId);
- ClusterInstance instance = new ClusterInstance(clusterInstance.getAlias(),
- cluster.getClusterId(),
- clusterInstance.getInstanceId());
- instance.setParentId(clusterInstance.getParentId());
- instance.setNetworkPartitionId(clusterInstance.getNetworkPartitionId());
- instance.setPartitionId(clusterInstance.getPartitionId());
- instance.setStatus(clusterInstance.getStatus());
- clusterMonitor.addInstance(instance);
- }
-
-
- }
- if (clusterMonitor.hasMonitoringStarted().compareAndSet(false, true)) {
- clusterMonitor.startScheduler();
- log.info("Monitoring task for Cluster Monitor with cluster id " +
- clusterInstanceCreatedEvent.getClusterId() + " started successfully");
- }
- } catch (PolicyValidationException e) {
- log.error(e.getMessage(), e);
- } catch (PartitionValidationException e) {
- log.error(e.getMessage(), e);
- }
- }
-
- } else {
- log.error("Service " + clusterInstanceCreatedEvent.getServiceName() +
- " not found, no cluster instance added to ClusterMonitor " +
- clusterInstanceCreatedEvent.getClusterId());
- }
-
- } finally {
- TopologyManager.releaseReadLockForCluster(clusterInstanceCreatedEvent.getServiceName(),
- clusterInstanceCreatedEvent.getClusterId());
- }
-
- } else {
- log.error("No Cluster Monitor found for cluster id " +
- clusterInstanceCreatedEvent.getClusterId());
- }
- }
- }
+ @Override
+ protected void onEvent(Event event) {
+
+ ClusterInstanceCreatedEvent clusterInstanceCreatedEvent =
+ (ClusterInstanceCreatedEvent) event;
+ AbstractClusterMonitor clusterMonitor = AutoscalerContext.getInstance().
+ getClusterMonitor(clusterInstanceCreatedEvent.getClusterId());
+ String instanceId = ((ClusterInstanceCreatedEvent) event).getInstanceId();
+ //FIXME to take lock when clusterMonitor is running
+ if (clusterMonitor != null) {
+ TopologyManager.acquireReadLockForCluster(clusterInstanceCreatedEvent.getServiceName(),
+ clusterInstanceCreatedEvent.getClusterId());
+
+ try {
+ Service service = TopologyManager.getTopology().
+ getService(clusterInstanceCreatedEvent.getServiceName());
+
+ if (service != null) {
+ Cluster cluster = service.getCluster(clusterInstanceCreatedEvent.getClusterId());
+ if (cluster != null) {
+ try {
+ if (cluster.isKubernetesCluster()) {
+ clusterMonitor.setClusterContext(
+ ClusterContextFactory.getKubernetesClusterContext(
+ instanceId,
+ cluster));
+ } else {
+ VMClusterContext clusterContext =
+ (VMClusterContext) clusterMonitor.getClusterContext();
+ if (clusterContext == null) {
+ clusterContext = ClusterContextFactory.
+ getVMClusterContext(instanceId,
+ cluster);
+ clusterMonitor.setClusterContext(clusterContext);
+
+ }
+ clusterContext.addInstanceContext(instanceId, cluster);
+ if (clusterMonitor.getInstance(instanceId) == null) {
+ ClusterInstance clusterInstance = cluster.
+ getInstanceContexts(instanceId);
+ ClusterInstance instance = new ClusterInstance(clusterInstance.getAlias(),
+ cluster.getClusterId(),
+ clusterInstance.getInstanceId());
+ instance.setParentId(clusterInstance.getParentId());
+ instance.setNetworkPartitionId(clusterInstance.getNetworkPartitionId());
+ instance.setPartitionId(clusterInstance.getPartitionId());
+ instance.setStatus(clusterInstance.getStatus());
+ clusterMonitor.addInstance(instance);
+ }
+
+
+ }
+ if (clusterMonitor.hasMonitoringStarted().compareAndSet(false, true)) {
+ clusterMonitor.startScheduler();
+ log.info("Monitoring task for Cluster Monitor with cluster id " +
+ clusterInstanceCreatedEvent.getClusterId() + " started successfully");
+ }
+ } catch (PolicyValidationException e) {
+ log.error(e.getMessage(), e);
+ } catch (PartitionValidationException e) {
+ log.error(e.getMessage(), e);
+ }
+ }
+
+ } else {
+ log.error("Service " + clusterInstanceCreatedEvent.getServiceName() +
+ " not found, no cluster instance added to ClusterMonitor " +
+ clusterInstanceCreatedEvent.getClusterId());
+ }
+
+ } finally {
+ TopologyManager.releaseReadLockForCluster(clusterInstanceCreatedEvent.getServiceName(),
+ clusterInstanceCreatedEvent.getClusterId());
+ }
+
+ } else {
+ log.error("No Cluster Monitor found for cluster id " +
+ clusterInstanceCreatedEvent.getClusterId());
+ }
+ }
+ }
);
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/3bd20e5e/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/MonitorFactory.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/MonitorFactory.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/MonitorFactory.java
index addffa4..964ff01 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/MonitorFactory.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/MonitorFactory.java
@@ -121,7 +121,7 @@ public class MonitorFactory {
groupMonitor.setParent(parentMonitor);
//Setting the dependent behaviour of the monitor
if (parentMonitor.hasStartupDependents() || (context.hasStartupDependents() &&
- context.hasChild())) {
+ context.hasChild())) {
groupMonitor.setHasStartupDependents(true);
} else {
groupMonitor.setHasStartupDependents(false);
@@ -146,7 +146,7 @@ public class MonitorFactory {
Group group = ApplicationHolder.getApplications().
getApplication(appId).getGroupRecursively(context.getId());
//Starting the minimum dependencies
- initialStartup = groupMonitor.startMinimumDependencies(group, instanceIds);
+ initialStartup = groupMonitor.createInstanceAndStartDependencyAtStartup(group, instanceIds);
} finally {
ApplicationHolder.releaseWriteLock();
}
@@ -222,7 +222,7 @@ public class MonitorFactory {
try {
Application application = ApplicationHolder.getApplications().getApplication(appId);
for (ApplicationInstance instance :
- application.getInstanceIdToInstanceContextMap().values()) {
+ application.getInstanceIdToInstanceContextMap().values()) {
//Starting statusChecking to make it sync with the Topology in the restart of stratos.
ServiceReferenceHolder.getInstance().
getGroupStatusProcessorChain().
@@ -282,7 +282,7 @@ public class MonitorFactory {
//setting the startup dependent behaviour of the cluster monitor
if (parentMonitor.hasStartupDependents() || (context.hasStartupDependents() &&
- context.hasChild())) {
+ context.hasChild())) {
clusterMonitor.setHasStartupDependents(true);
} else {
clusterMonitor.setHasStartupDependents(false);
@@ -295,16 +295,16 @@ public class MonitorFactory {
clusterMonitor.setHasGroupScalingDependent(false);
}
- for(String parentInstanceId : parentInstanceIds) {
+ for (String parentInstanceId : parentInstanceIds) {
Instance instance = parentMonitor.getInstance(parentInstanceId);
String partitionId = null;
- if(instance instanceof GroupInstance) {
- partitionId = ((GroupInstance)instance).getPartitionId();
+ if (instance instanceof GroupInstance) {
+ partitionId = ((GroupInstance) instance).getPartitionId();
}
- if(instance != null) {
+ if (instance != null) {
ClusterInstance clusterInstance = cluster.getInstanceContexts(parentInstanceId);
- if(clusterInstance != null) {
- if(cluster.isKubernetesCluster()) {
+ if (clusterInstance != null) {
+ if (cluster.isKubernetesCluster()) {
clusterMonitor.setClusterContext(
ClusterContextFactory.getKubernetesClusterContext(
clusterInstance.getInstanceId(),
@@ -318,7 +318,7 @@ public class MonitorFactory {
clusterMonitor.setClusterContext(clusterContext);
//create VMClusterContext and then add all the instanceContexts
clusterContext.addInstanceContext(parentInstanceId, cluster);
- if(clusterMonitor.getInstance(clusterInstance.getInstanceId()) == null) {
+ if (clusterMonitor.getInstance(clusterInstance.getInstanceId()) == null) {
clusterMonitor.addInstance(clusterInstance);
}
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/3bd20e5e/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java
index 8eaf32b..c8df090 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java
@@ -68,8 +68,7 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
private boolean groupScalingEnabled;
//Network partition contexts
private Map<String, GroupLevelNetworkPartitionContext> networkPartitionCtxts;
- //Group level partition contexts
- private List<GroupLevelPartitionContext> partitionContexts;
+
//Indicates whether the monitor is destroyed or not
private boolean isDestroyed;
//Monitoring interval of the monitor
@@ -125,7 +124,7 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
* @param status status of the group
*/
public void setStatus(GroupStatus status, String instanceId) {
- ((GroupInstance)this.instanceIdToInstanceMap.get(instanceId)).setStatus(status);
+ ((GroupInstance) this.instanceIdToInstanceMap.get(instanceId)).setStatus(status);
if (status == GroupStatus.Inactive && !this.hasStartupDependents) {
log.info("[Group] " + this.id + "is not notifying the parent, " +
@@ -191,9 +190,9 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
} else {
log.warn("[monitor] " + id + " cannot be found in the inActive monitors list");
}
- GroupInstance instance = (GroupInstance)this.instanceIdToInstanceMap.get(instanceId);
+ GroupInstance instance = (GroupInstance) this.instanceIdToInstanceMap.get(instanceId);
if (instance != null) {
- if(instance.getStatus() == GroupStatus.Terminating) {
+ if (instance.getStatus() == GroupStatus.Terminating) {
ServiceReferenceHolder.getInstance().getGroupStatusProcessorChain().process(this.id,
appId, instanceId);
} else {
@@ -201,7 +200,7 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
}
} else {
log.warn("The required instance cannot be found in the the [GroupMonitor] " +
- this.id);
+ this.id);
}
}
}
@@ -215,13 +214,13 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
statusEvent.getStatus() == ApplicationStatus.Terminating) {
//Get all the instances which related to this instanceId
GroupInstance instance = (GroupInstance) this.instanceIdToInstanceMap.get(instanceId);
- if(instance != null) {
+ if (instance != null) {
ApplicationBuilder.handleGroupTerminatingEvent(appId, id, instanceId);
} else {
//Using parentId need to get the children
List<String> instanceIds = this.getInstancesByParentInstanceId(instanceId);
- if(!instanceIds.isEmpty()) {
- for(String instanceId1 : instanceIds) {
+ if (!instanceIds.isEmpty()) {
+ for (String instanceId1 : instanceIds) {
ApplicationBuilder.handleGroupTerminatingEvent(appId, id, instanceId1);
}
}
@@ -291,47 +290,6 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
}
/**
- * This will start the minimum required dependency instances
- * based on the given parent instance ids
- *
- * @param group blue print of the instance to be started
- * @param parentInstanceIds parent instanceIds used to start the child instance
- * @return whether first app startup or not
- * @throws TopologyInConsistentException
- */
- public boolean startMinimumDependencies(Group group, List<String> parentInstanceIds)
- throws TopologyInConsistentException {
- boolean initialStartup = false;
- int min = group.getGroupMinInstances();
- if (group.getInstanceContextCount() >= min) {
- startDependency(group);
- } else {
- if (group.getInstanceContextCount() > 0) {
- List<String> instanceIds = new ArrayList<String>();
- for (String parentInstanceId : parentInstanceIds) {
- List<Instance> contexts1 = group.getInstanceContextsWithParentId(parentInstanceId);
- //Finding the non startable instance ids
- if (group.getInstanceContexts(parentInstanceId) == null || contexts1.isEmpty() ||
- contexts1.size() == 0) {
- instanceIds.add(parentInstanceId);
-
- }
- }
- if (instanceIds.size() > 0) {
- //createInstanceAndStartDependency(group, instanceIds);
- } else {
- startDependency(group);
- }
- } else {
- //No available instances in the Applications. Need to start them all
- createInstanceAndStartDependencyAtStartup(group, parentInstanceIds);
- initialStartup = true;
- }
- }
- return initialStartup;
- }
-
- /**
* Gets the parent instance context.
*
* @param parentInstanceId the parent instance id
@@ -339,7 +297,7 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
*/
private Instance getParentInstanceContext(String parentInstanceId) {
Instance parentInstanceContext;
-
+
Application application = ApplicationHolder.getApplications().getApplication(this.appId);
if (this.id.equals(appId)) {
parentInstanceContext = application.getInstanceContexts(parentInstanceId);
@@ -347,146 +305,204 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
Group parentGroup = application.getGroupRecursively(this.parent.getId());
parentInstanceContext = parentGroup.getInstanceContexts(parentInstanceId);
}
-
+
return parentInstanceContext;
}
-
+
/**
* Gets the group level network partition context.
*
* @param parentInstanceContext the parent instance context
* @return the group level network partition context
*/
- private GroupLevelNetworkPartitionContext getGroupLevelNetworkPartitionContext(Instance parentInstanceContext) {
- GroupLevelNetworkPartitionContext groupLevelNetworkPartitionContext;
+ private GroupLevelNetworkPartitionContext getGroupLevelNetworkPartitionContext(String groupId,
+ String appId,
+ Instance parentInstanceContext) {
+ GroupLevelNetworkPartitionContext groupLevelNetworkPartitionContext;
+ ChildPolicy policy = PolicyManager.getInstance().
+ getDeploymentPolicyByApplication(appId).
+ getChildPolicy(groupId);
+
+
if (this.networkPartitionCtxts.containsKey(parentInstanceContext)) {
groupLevelNetworkPartitionContext = this.networkPartitionCtxts.
get(parentInstanceContext.getNetworkPartitionId());
} else {
- groupLevelNetworkPartitionContext = new GroupLevelNetworkPartitionContext(
- parentInstanceContext.getNetworkPartitionId(),
- null, null);
+ if (policy != null) {
+ ChildLevelNetworkPartition networkPartition = policy.
+ getChildLevelNetworkPartition(parentInstanceContext.getNetworkPartitionId());
+ groupLevelNetworkPartitionContext = new GroupLevelNetworkPartitionContext(
+ parentInstanceContext.getNetworkPartitionId(),
+ networkPartition.getPartitionAlgo());
+ } else {
+ groupLevelNetworkPartitionContext = new GroupLevelNetworkPartitionContext(
+ parentInstanceContext.getNetworkPartitionId());
+ }
this.addNetworkPartitionContext(groupLevelNetworkPartitionContext);
}
return groupLevelNetworkPartitionContext;
}
-
+
/**
- * Finds the correct partition context to which the instance should be added to and
+ * Finds the correct partition context to which the instance should be added to and
* created and adds required context objects.
*
- * @param parentInstanceContext the parent instance context
- * @param group the group
+ * @param parentInstanceContext the parent instance context
+ * @param networkPartitionContext the GroupLevelNetworkPartitionContext
* @return the partition context
*/
- private String FindAndAddPartitionContext(Instance parentInstanceContext, Group group, boolean startup) {
- PartitionContext partitionContext = null;
-
- String networkPartitionId = parentInstanceContext.getNetworkPartitionId();
- List<GroupLevelPartitionContext> childParitionContexts = null;
-
+ private void addPartitionContext(Instance parentInstanceContext,
+ GroupLevelNetworkPartitionContext networkPartitionContext) {
+
+ String networkPartitionId = parentInstanceContext.getNetworkPartitionId();
+ List<GroupLevelPartitionContext> childPartitionContexts;
+
ChildPolicy policy = PolicyManager.getInstance().
- getDeploymentPolicyByApplication(group.getApplicationId()).
- getChildPolicy(group.getUniqueIdentifier());
-
- ChildLevelNetworkPartition networkPartition = policy.
- getChildLevelNetworkPartition(networkPartitionId);
-
- if (startup) {
- // Create childPartitionContexts for all possibilities if startup
- ChildLevelPartition[] childLevelPartitions = networkPartition.getChildLevelPartitions();
- childParitionContexts = new ArrayList<GroupLevelPartitionContext>();
- for (ChildLevelPartition childLevelPartition : childLevelPartitions) {
- partitionContext = new GroupLevelPartitionContext(childLevelPartition.getMax(), childLevelPartition.getPartitionId(), networkPartitionId);
- childParitionContexts.add((GroupLevelPartitionContext) partitionContext);
- this.addPartitionContext((GroupLevelPartitionContext)partitionContext);
+ getDeploymentPolicyByApplication(this.appId).
+ getChildPolicy(this.id);
+
+
+ PartitionContext partitionContext;
+ String parentPartitionId = parentInstanceContext.getPartitionId();
+
+ if (policy == null) {
+ if (parentPartitionId != null &&
+ networkPartitionContext.getPartitionCtxt(parentPartitionId) != null) {
+ partitionContext = new GroupLevelPartitionContext(0);
+ networkPartitionContext.addPartitionContext((GroupLevelPartitionContext) partitionContext);
}
} else {
- // Get partition contexts already created
- childParitionContexts = this.getPartitionCtxts();
+ ChildLevelNetworkPartition networkPartition = policy.
+ getChildLevelNetworkPartition(networkPartitionId);
+ if (networkPartitionContext.getPartitionCtxts().isEmpty()) {
+ // Create childPartitionContexts for all possibilities if startup
+ ChildLevelPartition[] childLevelPartitions = networkPartition.getChildLevelPartitions();
+ childPartitionContexts = new ArrayList<GroupLevelPartitionContext>();
+
+ for (ChildLevelPartition childLevelPartition : childLevelPartitions) {
+ partitionContext = new GroupLevelPartitionContext(childLevelPartition.getMax(),
+ childLevelPartition.getPartitionId(), networkPartitionId);
+ childPartitionContexts.add((GroupLevelPartitionContext) partitionContext);
+ networkPartitionContext.addPartitionContext(
+ (GroupLevelPartitionContext) partitionContext);
+ }
+ }
}
-
- // Get partitionContext to create instance in
- AutoscaleAlgorithm algorithm = this.getAutoscaleAlgorithm(networkPartition.getPartitionAlgo());
- partitionContext = algorithm.getNextScaleUpPartitionContext((PartitionContext[]) childParitionContexts.toArray());
-
- return partitionContext.getPartitionId();
}
/**
* Creates the group instance and adds the required context objects
*
- * @param group the group
- * @param parentInstanceContext the parent instance context
- * @param partitionContext the partition context
+ * @param group the group
+ * @param parentInstanceContext the parent instance context
+ * @param partitionContext
* @param groupLevelNetworkPartitionContext the group level network partition context
- * @param instanceIdstoStart the container with instance ids to start
*/
- private String createGroupInstance(Group group, Instance parentInstanceContext, String partitionId,
- GroupLevelNetworkPartitionContext groupLevelNetworkPartitionContext, String deploymentPolicyName, boolean startup)
- {
- GroupInstance groupInstance = createGroupInstance(group, parentInstanceContext.getInstanceId(), partitionId, parentInstanceContext.getNetworkPartitionId());
+ private String createGroupInstanceAndAddToMonitor(Group group, Instance parentInstanceContext,
+ PartitionContext partitionContext,
+ GroupLevelNetworkPartitionContext groupLevelNetworkPartitionContext,
+ GroupInstance groupInstance) {
+
+ String partitionId;
+
+ if (groupInstance == null) {
+ partitionId = partitionContext.getPartitionId();
+
+ groupInstance = createGroupInstance(group, parentInstanceContext.getInstanceId(),
+ partitionId, parentInstanceContext.getNetworkPartitionId());
+ }
+
this.addInstance(groupInstance);
-
+
String instanceId = groupInstance.getInstanceId();
GroupInstanceContext groupInstanceContext = new GroupInstanceContext(instanceId);
- PartitionContext partitionContext = this.getPartitionCtxt(partitionId);
-
- if (deploymentPolicyName != null && partitionContext != null && startup) {
- groupInstanceContext.addPartitionContext((GroupLevelPartitionContext)partitionContext);
- }
+
+ groupInstanceContext.addPartitionContext((GroupLevelPartitionContext) partitionContext);
groupLevelNetworkPartitionContext.addInstanceContext(groupInstanceContext);
-
+
if (partitionContext != null) {
- ((GroupLevelPartitionContext)partitionContext).addActiveInstance(groupInstance);
+ ((GroupLevelPartitionContext) partitionContext).addActiveInstance(groupInstance);
}
-
+
return instanceId;
}
-
+
/**
* This will create the required instance and start the dependency
- * This method will be called on initial startup
+ * This method will be called on initial startup
*
* @param group blue print of the instance to be started
* @param parentInstanceIds parent instanceIds used to start the child instance
* @throws TopologyInConsistentException
*/
- public void createInstanceAndStartDependencyAtStartup(Group group, List<String> parentInstanceIds)
+ public boolean createInstanceAndStartDependencyAtStartup(Group group, List<String> parentInstanceIds)
throws TopologyInConsistentException {
- List<String> instanceIdstoStart = new ArrayList<String>();
-
+ boolean initialStartup = true;
+ List<String> instanceIdsToStart = new ArrayList<String>();
+
for (String parentInstanceId : parentInstanceIds) {
// Get parent instance context
Instance parentInstanceContext = getParentInstanceContext(parentInstanceId);
-
- // Get existing or create new GroupLevelNetwokPartitionContext
- GroupLevelNetworkPartitionContext groupLevelNetworkPartitionContext = getGroupLevelNetworkPartitionContext(parentInstanceContext);
-
- // Determine partitionContext
- String deploymentPolicyName = group.getDeploymentPolicy();
- String partitionId = null;
- if(deploymentPolicyName != null) {
- partitionId = FindAndAddPartitionContext(parentInstanceContext, group, true);
- }
- else {
- GroupInstance instance = (GroupInstance) this.parent.getInstance(parentInstanceId);
- if (instance != null) {
- partitionId = instance.getPartitionId();
- }
- }
-
+
+ // Get existing or create new GroupLevelNetworkPartitionContext
+ GroupLevelNetworkPartitionContext groupLevelNetworkPartitionContext =
+ getGroupLevelNetworkPartitionContext(group.getUniqueIdentifier(),
+ this.appId, parentInstanceContext);
+ //adding the partitionContext to the network partition context
+ addPartitionContext(parentInstanceContext, groupLevelNetworkPartitionContext);
+
String groupInstanceId;
+ PartitionContext partitionContext;
+ String parentPartitionId = parentInstanceContext.getPartitionId();
+
// Create GroupInstance for partition instance and add to required contexts for minimum instance count
- for(int i=0; i<groupLevelNetworkPartitionContext.getMinInstanceCount(); i++) {
-
- groupInstanceId = createGroupInstance(group, parentInstanceContext, partitionId, groupLevelNetworkPartitionContext, deploymentPolicyName, true);
- instanceIdstoStart.add(groupInstanceId);
+ int groupMin = groupLevelNetworkPartitionContext.getMinInstanceCount();
+
+ //Have to check whether group has generated its own instances
+ List<Instance> existingGroupInstances = group.getInstanceContextsWithParentId(parentInstanceId);
+ for(Instance instance : existingGroupInstances) {
+ initialStartup = false;
+ partitionContext = groupLevelNetworkPartitionContext.
+ getPartitionContextById(parentPartitionId);
+ groupInstanceId = createGroupInstanceAndAddToMonitor(group, parentInstanceContext,
+ partitionContext,
+ groupLevelNetworkPartitionContext,
+ null);
+ instanceIdsToStart.add(groupInstanceId);
}
+
+ /**
+ * If the group instances have been partially created or not created,
+ * then create everything
+ */
+ if(existingGroupInstances.size() <= groupMin) {
+ for (int i = 0; i < groupMin - existingGroupInstances.size(); i++) {
+ // Get partitionContext to create instance in
+ if (parentPartitionId == null) {
+ AutoscaleAlgorithm algorithm = this.getAutoscaleAlgorithm(
+ groupLevelNetworkPartitionContext.getPartitionAlgorithm());
+ partitionContext = algorithm.getNextScaleUpPartitionContext(
+ (PartitionContext[]) groupLevelNetworkPartitionContext.
+ getPartitionCtxts().toArray());
+ } else {
+ partitionContext = groupLevelNetworkPartitionContext.
+ getPartitionContextById(parentPartitionId);
+ }
+ groupInstanceId = createGroupInstanceAndAddToMonitor(group, parentInstanceContext,
+ partitionContext,
+ groupLevelNetworkPartitionContext,
+ null);
+ instanceIdsToStart.add(groupInstanceId);
+ }
+ }
+
}
- startDependency(group, instanceIdstoStart);
+ startDependency(group, instanceIdsToStart);
+ return initialStartup;
}
-
+
+
+
/**
* This will start the group instance based on the given parent instanceId
* A new monitor is not created in this case
@@ -497,34 +513,45 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
*/
public void createInstanceAndStartDependencyOnScaleup(Group group, String parentInstanceId)
throws MonitorNotFoundException {
- // Get parent instance context
+ // Get parent instance context
Instance parentInstanceContext = getParentInstanceContext(parentInstanceId);
-
- // Get existing or create new GroupLevelNetwokPartitionContext
- GroupLevelNetworkPartitionContext groupLevelNetworkPartitionContext = getGroupLevelNetworkPartitionContext(parentInstanceContext);
-
- // Determine partitionContext
- String deploymentPolicyName = group.getDeploymentPolicy();
- String partitionId = null;
- if(deploymentPolicyName != null) {
- partitionId = FindAndAddPartitionContext(parentInstanceContext, group, false);
- }
- else {
- GroupInstance instance = (GroupInstance) this.parent.getInstance(parentInstanceId);
- if (instance != null) {
- partitionId = instance.getPartitionId();
- }
+
+ // Get existing or create new GroupLevelNetworkPartitionContext
+ GroupLevelNetworkPartitionContext groupLevelNetworkPartitionContext =
+ getGroupLevelNetworkPartitionContext(group.getUniqueIdentifier(),
+ this.appId, parentInstanceContext);
+ //adding the partitionContext to the network partition context
+ addPartitionContext(parentInstanceContext, groupLevelNetworkPartitionContext);
+
+ String groupInstanceId;
+ PartitionContext partitionContext;
+ String parentPartitionId = parentInstanceContext.getPartitionId();
+ int groupMax = groupLevelNetworkPartitionContext.getMaxInstanceCount();
+ if(group.getInstanceContextCount() < groupMax) {
+ // Get partitionContext to create instance in
+ if (parentPartitionId == null) {
+ AutoscaleAlgorithm algorithm = this.getAutoscaleAlgorithm(
+ groupLevelNetworkPartitionContext.getPartitionAlgorithm());
+ partitionContext = algorithm.getNextScaleUpPartitionContext(
+ (PartitionContext[]) groupLevelNetworkPartitionContext.
+ getPartitionCtxts().toArray());
+ } else {
+ partitionContext = groupLevelNetworkPartitionContext.
+ getPartitionContextById(parentPartitionId);
+ }
+ groupInstanceId = createGroupInstanceAndAddToMonitor(group, parentInstanceContext,
+ partitionContext,
+ groupLevelNetworkPartitionContext,
+ null);
+ startDependency(group, groupInstanceId);
+ } else {
+ log.warn("[Group] " + group.getUniqueIdentifier() + " has reached the maximum limit as " +
+ "[max] " + groupMax + ". Hence trying to notify the parent.");
}
- String groupInstanceId = createGroupInstance(group, parentInstanceContext, partitionId, groupLevelNetworkPartitionContext, deploymentPolicyName, false);
- startDependency(group, groupInstanceId);
- }
-
- public void createInstanceAndStartDependencyOnRestart(Group group, List<String> parentInstanceIds) {
- // TODO: Need to add functionality when restart happens
- // Should only do required work from Monitor side and not from Topology since that is already existent
}
-
+
+
/**
* This will create the group instance in the applications Topology
*
@@ -535,7 +562,7 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
* @return
*/
private GroupInstance createGroupInstance(Group group, String parentInstanceId, String partitionId,
- String networkPartitionId) {
+ String networkPartitionId) {
String instanceId = parentInstanceId;
int minGroupInstances = group.getGroupMinInstances();
int maxGroupInstances = group.getGroupMaxInstances();
@@ -567,42 +594,5 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
this.isDestroyed = isDestroyed;
}
- public List<GroupLevelPartitionContext> getPartitionCtxts() {
-
- return partitionContexts;
- }
-
- public GroupLevelPartitionContext getPartitionCtxt(String partitionId) {
-
- for(GroupLevelPartitionContext partitionContext : partitionContexts){
- if(partitionContext.getPartitionId().equals(partitionId)){
- return partitionContext;
- }
- }
- return null;
- }
-
- public void addPartitionContext(GroupLevelPartitionContext partitionContext) {
- partitionContexts.add(partitionContext);
- }
-
- public int getNonTerminatedMemberCountOfPartition(String partitionId) {
- for(GroupLevelPartitionContext partitionContext : partitionContexts){
- if(partitionContext.getPartitionId().equals(partitionId)){
- return partitionContext.getNonTerminatedInstanceCount();
- }
- }
- return 0;
- }
-
- public int getActiveMemberCount(String currentPartitionId) {
-
- for(GroupLevelPartitionContext partitionContext : partitionContexts){
- if(partitionContext.getPartitionId().equals(currentPartitionId)){
- return partitionContext.getActiveInstanceCount();
- }
- }
- return 0;
- }
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/3bd20e5e/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ParentComponentMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ParentComponentMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ParentComponentMonitor.java
index 136cb9f..a0710ac 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ParentComponentMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ParentComponentMonitor.java
@@ -90,7 +90,7 @@ public abstract class ParentComponentMonitor extends Monitor {
public void startDependency(ParentComponent component, List<String> instanceIds) {
//start the first dependency
List<ApplicationChildContext> applicationContexts = this.startupDependencyTree.
- getStarAbleDependencies();
+ getStarAbleDependencies(); //TODO t
startDependency(applicationContexts, instanceIds);
}
@@ -280,17 +280,17 @@ public abstract class ParentComponentMonitor extends Monitor {
}
/**
- * @param eventId
+ * @param childId
*/
- protected void onChildInactiveEvent(String eventId, String instanceId) {
+ protected void onChildInactiveEvent(String childId, String instanceId) {
List<ApplicationChildContext> terminationList;
Monitor monitor;
- terminationList = this.startupDependencyTree.getTerminationDependencies(eventId);
+ terminationList = this.startupDependencyTree.getTerminationDependencies(childId);
//Need to notify the parent about the status change from Active-->InActive
- if (this.parent != null) {
+ // TODO to make app also inaction if (this.parent != null) {
ServiceReferenceHolder.getInstance().getGroupStatusProcessorChain().
process(this.id, this.appId, instanceId);
- }
+ //}
//TODO checking whether terminating them in reverse order,
// TODO if so can handle it in the parent event.
@@ -302,15 +302,15 @@ public abstract class ParentComponentMonitor extends Monitor {
//handling the killall scenario
if (this.parent != null) {
//send terminating to the parent. So that it will push terminating to its children
- ApplicationBuilder.handleGroupTerminatingEvent(this.appId, eventId, instanceId);
+ ApplicationBuilder.handleGroupTerminatingEvent(this.appId, childId, instanceId);
} else {
//if it is an application, send terminating event individually for children
- sendTerminatingEventOnNotification(terminationList, eventId, true, instanceId);
+ sendTerminatingEventOnNotification(terminationList, childId, true, instanceId);
}
- log.info("The group" + eventId + " has been marked as terminating " +
+ log.info("The group" + childId + " has been marked as terminating " +
"due to all the children are to be terminated");
} else {
- sendTerminatingEventOnNotification(terminationList, eventId, false, instanceId);
+ sendTerminatingEventOnNotification(terminationList, childId, false, instanceId);
}
}
@@ -605,6 +605,7 @@ public abstract class ParentComponentMonitor extends Monitor {
int retries = 5;
boolean success;
do {
+ //TODO remove thread.sleep, exectutor service
try {
Thread.sleep(5000);
} catch (InterruptedException e1) {
http://git-wip-us.apache.org/repos/asf/stratos/blob/3bd20e5e/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/deployment/DeploymentPolicy.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/deployment/DeploymentPolicy.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/deployment/DeploymentPolicy.java
index fb63c02..e2a6819 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/deployment/DeploymentPolicy.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/deployment/DeploymentPolicy.java
@@ -40,7 +40,6 @@ public class DeploymentPolicy implements Serializable{
private String description;
private boolean isPublic;
private ApplicationLevelNetworkPartition[] applicationLevelNetworkPartitions;
- private ChildPolicyHolder childPolicyHolder;
private ChildPolicy[] childPolicies;
private int tenantId;
@@ -193,25 +192,12 @@ public class DeploymentPolicy implements Serializable{
+" [partitions] " + Arrays.toString(this.getAllPartitions());
}
- public ChildLevelNetworkPartition getChildLevelNetworkPartition(String networkPartitionId) {
-
- childPolicyHolder.getChildLevelNetworkPartitionById(networkPartitionId);
- return null;
- }
public ChildLevelNetworkPartition[] getChildLevelNetworkPartitions() {
//TODO create a map of child level network partition context and return correct one
return new ChildLevelNetworkPartition[0];
}
- public ChildPolicyHolder getChildPolicyHolder() {
- return childPolicyHolder;
- }
-
- public void setChildPolicyHolder(ChildPolicyHolder childPolicyHolder) {
- this.childPolicyHolder = childPolicyHolder;
- }
-
public ChildPolicy[] getChildPolicies() {
return childPolicies;
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/3bd20e5e/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusActiveProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusActiveProcessor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusActiveProcessor.java
index c007a46..5a47401 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusActiveProcessor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusActiveProcessor.java
@@ -82,6 +82,7 @@ public class ClusterStatusActiveProcessor extends ClusterStatusProcessor {
log.info("Publishing Cluster activated event for [application]: "
+ monitor.getAppId() + " [cluster]: " + clusterId);
}
+ //TODO service call
ClusterStatusEventPublisher.sendClusterActivatedEvent(monitor.getAppId(),
monitor.getServiceId(), monitor.getClusterId(), instanceId);
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/3bd20e5e/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusInActiveProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusInActiveProcessor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusInActiveProcessor.java
index 91305bf..c3b1d05 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusInActiveProcessor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusInActiveProcessor.java
@@ -79,14 +79,14 @@ public class ClusterStatusInActiveProcessor extends ClusterStatusProcessor {
//send cluster In-Active event to cluster status topic
ClusterStatusEventPublisher.sendClusterInActivateEvent(monitor.getAppId(),
monitor.getServiceId(), clusterId, instanceId);
- } else {
+ } /*else {
if (log.isInfoEnabled()) {
log.info("Publishing Cluster active event for [application]: "
+ monitor.getAppId() + " [cluster]: " + clusterId);
}
- ClusterStatusEventPublisher.sendClusterActivatedEvent(monitor.getAppId(),
- monitor.getServiceId(), clusterId, instanceId);
- }
+ //ClusterStatusEventPublisher.sendClusterActivatedEvent(monitor.getAppId(),
+ // monitor.getServiceId(), clusterId, instanceId);
+ }*/
return clusterInActive;
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/3bd20e5e/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusInActiveProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusInActiveProcessor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusInActiveProcessor.java
index 90b608c..7911727 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusInActiveProcessor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusInActiveProcessor.java
@@ -160,6 +160,7 @@ public class GroupStatusInActiveProcessor extends GroupStatusProcessor {
} else {
groupStat = false;
}
+ //TODO get by parent
}
return groupStat;
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/3bd20e5e/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/GroupDefinition.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/GroupDefinition.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/GroupDefinition.java
index 0d77628..109370d 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/GroupDefinition.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/GroupDefinition.java
@@ -37,7 +37,7 @@ public class GroupDefinition implements Serializable {
private int groupMaxInstances;
public boolean isGroupScalingEnabled;
-
+
private List<CartridgeDefinition> cartridges;
private List<GroupDefinition> groups;
http://git-wip-us.apache.org/repos/asf/stratos/blob/3bd20e5e/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/instance/ClusterInstance.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/instance/ClusterInstance.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/instance/ClusterInstance.java
index 38d1108..5dd9d19 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/instance/ClusterInstance.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/instance/ClusterInstance.java
@@ -26,8 +26,6 @@ import org.apache.stratos.messaging.domain.topology.lifecycle.LifeCycleStateMana
import java.util.Stack;
public class ClusterInstance extends Instance<ClusterStatus> implements LifeCycleStateTransitionBehavior<ClusterStatus> {
- //partition id
- private String partitionId;
public ClusterInstance(String alias, String clusterId, String instanceId) {
super(alias, instanceId);
@@ -55,15 +53,6 @@ public class ClusterInstance extends Instance<ClusterStatus> implements LifeCycl
return this.lifeCycleStateManager.changeState(newState);
}
- public String getPartitionId() {
- return partitionId;
- }
-
- public void setPartitionId(String partitionId) {
- this.partitionId = partitionId;
- }
-
-
/**
* Get the current state
*
http://git-wip-us.apache.org/repos/asf/stratos/blob/3bd20e5e/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/instance/GroupInstance.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/instance/GroupInstance.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/instance/GroupInstance.java
index dd28fc3..88c34e2 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/instance/GroupInstance.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/instance/GroupInstance.java
@@ -26,8 +26,6 @@ import org.apache.stratos.messaging.domain.topology.lifecycle.LifeCycleStateMana
import java.util.Stack;
public class GroupInstance extends Instance<GroupStatus> implements LifeCycleStateTransitionBehavior<GroupStatus> {
- //partition id
- private String partitionId;
public GroupInstance(String alias, String instanceId) {
super(alias, instanceId);
@@ -55,11 +53,5 @@ public class GroupInstance extends Instance<GroupStatus> implements LifeCycleSta
return this.lifeCycleStateManager.changeState(newState);
}
- public String getPartitionId() {
- return partitionId;
- }
- public void setPartitionId(String partitionId) {
- this.partitionId = partitionId;
- }
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/3bd20e5e/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/instance/Instance.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/instance/Instance.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/instance/Instance.java
index a994d2e..ba6f089 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/instance/Instance.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/instance/Instance.java
@@ -39,6 +39,9 @@ public abstract class Instance<T extends LifeCycleState> implements Serializable
private String parentId;
//Network partition id
private String networkPartitionId;
+ //partition id
+ protected String partitionId;
+
public Instance(String alias, String instanceId) {
this.alias = alias;
@@ -96,5 +99,13 @@ public abstract class Instance<T extends LifeCycleState> implements Serializable
this.networkPartitionId = networkPartitionId;
}
+ public String getPartitionId() {
+ return partitionId;
+ }
+
+ public void setPartitionId(String partitionId) {
+ this.partitionId = partitionId;
+ }
+
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/3bd20e5e/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/applications/ApplicationsMessageProcessorChain.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/applications/ApplicationsMessageProcessorChain.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/applications/ApplicationsMessageProcessorChain.java
index b88a3ec..98b34ad 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/applications/ApplicationsMessageProcessorChain.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/applications/ApplicationsMessageProcessorChain.java
@@ -36,6 +36,7 @@ public class ApplicationsMessageProcessorChain extends MessageProcessorChain {
private GroupInstanceInActivateProcessor groupInActivateMessageProcessor;
private GroupInstanceTerminatedProcessor groupTerminatedProcessor;
private GroupInstanceTerminatingProcessor groupTerminatingProcessor;
+ private ApplicationInstanceCreatedMessageProcessor applicationInstanceCreatedMessageProcessor;
private ApplicationInstanceActivatedMessageProcessor applicationActivatedMessageProcessor;
private ApplicationCreatedMessageProcessor applicationCreatedMessageProcessor;
private ApplicationInstanceInactivatedMessageProcessor applicationInactivatedMessageProcessor;
@@ -61,6 +62,9 @@ public class ApplicationsMessageProcessorChain extends MessageProcessorChain {
groupTerminatingProcessor = new GroupInstanceTerminatingProcessor();
add(groupTerminatingProcessor);
+ applicationInstanceCreatedMessageProcessor = new ApplicationInstanceCreatedMessageProcessor();
+ add(applicationInstanceCreatedMessageProcessor);
+
applicationActivatedMessageProcessor = new ApplicationInstanceActivatedMessageProcessor();
add(applicationActivatedMessageProcessor);
@@ -96,6 +100,8 @@ public class ApplicationsMessageProcessorChain extends MessageProcessorChain {
groupTerminatingProcessor.addEventListener(eventListener);
} else if (eventListener instanceof GroupInstanceTerminatedEventListener) {
groupTerminatedProcessor.addEventListener(eventListener);
+ } else if (eventListener instanceof ApplicationInstanceCreatedEventListener) {
+ applicationInstanceCreatedMessageProcessor.addEventListener(eventListener);
} else if (eventListener instanceof ApplicationCreatedEventListener) {
applicationCreatedMessageProcessor.addEventListener(eventListener);
} else if (eventListener instanceof ApplicationInstanceActivatedEventListener) {
http://git-wip-us.apache.org/repos/asf/stratos/blob/3bd20e5e/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41.java b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41.java
index fcc128d..fc31362 100644
--- a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41.java
+++ b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41.java
@@ -330,7 +330,7 @@ public class StratosApiV41 extends AbstractApi {
@AuthorizationAction("/permission/admin/manage/add/deploymentPolicy")
public Response deployDeploymentPolicyDefinition(DeploymentPolicy deploymentPolicy)
throws RestAPIException {
-
+ //TODO change the name to deployApplication
String policyId = StratosApiV41Utils.deployDeploymentPolicy(deploymentPolicy);
URI url = uriInfo.getAbsolutePathBuilder().path(policyId).build();
return Response.created(url).build();