Repository: stratos
Updated Branches:
  refs/heads/master 18745a09b -> 9d474679f


handling new instance creation


Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/9d474679
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/9d474679
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/9d474679

Branch: refs/heads/master
Commit: 9d474679fc569e8176caf85314529d4592f658c4
Parents: 18745a0
Author: reka <[email protected]>
Authored: Fri Nov 28 19:12:52 2014 +0530
Committer: reka <[email protected]>
Committed: Fri Nov 28 19:13:05 2014 +0530

----------------------------------------------------------------------
 .../applications/topic/ApplicationBuilder.java  |   3 +-
 .../autoscaler/monitor/EventHandler.java        |   5 +-
 .../monitor/component/ApplicationMonitor.java   |   7 +-
 .../monitor/component/GroupMonitor.java         | 134 +++++++++++++------
 .../component/ParentComponentMonitor.java       |  30 ++---
 .../monitor/events/ClusterStatusEvent.java      |   7 +
 .../monitor/events/GroupStatusEvent.java        |   2 +
 .../autoscaler/monitor/events/MonitorEvent.java |   8 ++
 .../monitor/events/MonitorStatusEvent.java      |   6 +
 .../builder/MonitorStatusEventBuilder.java      |  24 +++-
 .../domain/instance/ClusterInstance.java        |  11 +-
 .../domain/instance/GroupInstance.java          |  10 ++
 12 files changed, 181 insertions(+), 66 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/9d474679/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java
 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java
index d01cd70..5c9c873 100644
--- 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java
+++ 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java
@@ -356,7 +356,8 @@ public class ApplicationBuilder {
     }
 
     public static void handleGroupInstanceCreatedEvent(String appId, String 
groupId, String instanceId,
-                                                       String parentId) {
+                                                       String parentId, String 
partitionId,
+                                                       String 
networkPartitionId) {
         if (log.isDebugEnabled()) {
             log.debug("Handling Group creation for the [group]: " + groupId +
                     " in the [application] " + appId);

http://git-wip-us.apache.org/repos/asf/stratos/blob/9d474679/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/EventHandler.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/EventHandler.java
 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/EventHandler.java
index 5fcbb2c..bf65eb4 100644
--- 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/EventHandler.java
+++ 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/EventHandler.java
@@ -18,6 +18,8 @@
  */
 package org.apache.stratos.autoscaler.monitor;
 
+import 
org.apache.stratos.autoscaler.exception.application.ParentMonitorNotFoundException;
+import 
org.apache.stratos.autoscaler.exception.application.TopologyInConsistentException;
 import org.apache.stratos.autoscaler.monitor.events.MonitorScalingEvent;
 import org.apache.stratos.autoscaler.monitor.events.MonitorStatusEvent;
 
@@ -37,7 +39,8 @@ public interface EventHandler {
      *
      * @param statusEvent
      */
-    public abstract void onParentStatusEvent(MonitorStatusEvent statusEvent);
+    public abstract void onParentStatusEvent(MonitorStatusEvent statusEvent) 
throws
+                                        ParentMonitorNotFoundException;
 
     /**
      * Triggered when a scaling event is received from a child.

http://git-wip-us.apache.org/repos/asf/stratos/blob/9d474679/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ApplicationMonitor.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ApplicationMonitor.java
 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ApplicationMonitor.java
index ccd0f3d..e845e8e 100644
--- 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ApplicationMonitor.java
+++ 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ApplicationMonitor.java
@@ -107,7 +107,12 @@ public class ApplicationMonitor extends 
ParentComponentMonitor {
      */
     public void setStatus(ApplicationStatus status, String instanceId) {
         //notify the children about the state change
-        MonitorStatusEventBuilder.notifyChildren(this, new 
ApplicationStatusEvent(status, appId, null));
+        try {
+            MonitorStatusEventBuilder.notifyChildren(this, new 
ApplicationStatusEvent(status, appId, instanceId));
+        } catch (ParentMonitorNotFoundException e) {
+            log.error("Error while notifying the children from [application] " 
+ appId, e);
+            //TODO revert siblings
+        }
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/stratos/blob/9d474679/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 2f1645b..d357946 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
@@ -20,23 +20,29 @@ package org.apache.stratos.autoscaler.monitor.component;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.stratos.autoscaler.context.AutoscalerContext;
-import 
org.apache.stratos.autoscaler.context.partition.network.GroupLevelNetworkPartitionContext;
 import org.apache.stratos.autoscaler.algorithm.AutoscaleAlgorithm;
 import org.apache.stratos.autoscaler.applications.ApplicationHolder;
 import 
org.apache.stratos.autoscaler.applications.dependency.context.ApplicationChildContext;
 import 
org.apache.stratos.autoscaler.applications.dependency.context.GroupChildContext;
 import org.apache.stratos.autoscaler.applications.topic.ApplicationBuilder;
+import org.apache.stratos.autoscaler.context.AutoscalerContext;
+import 
org.apache.stratos.autoscaler.context.partition.network.GroupLevelNetworkPartitionContext;
 import 
org.apache.stratos.autoscaler.exception.application.DependencyBuilderException;
+import 
org.apache.stratos.autoscaler.exception.application.ParentMonitorNotFoundException;
 import 
org.apache.stratos.autoscaler.exception.application.TopologyInConsistentException;
 import org.apache.stratos.autoscaler.monitor.EventHandler;
 import org.apache.stratos.autoscaler.monitor.Monitor;
+import org.apache.stratos.autoscaler.monitor.events.GroupStatusEvent;
+import org.apache.stratos.autoscaler.monitor.events.MonitorScalingEvent;
+import org.apache.stratos.autoscaler.monitor.events.MonitorStatusEvent;
 import 
org.apache.stratos.autoscaler.monitor.events.builder.MonitorStatusEventBuilder;
-import org.apache.stratos.autoscaler.monitor.events.*;
 import org.apache.stratos.autoscaler.partition.NetworkPartition;
 import org.apache.stratos.autoscaler.policy.PolicyManager;
 import org.apache.stratos.autoscaler.policy.model.DeploymentPolicy;
-import org.apache.stratos.messaging.domain.applications.*;
+import org.apache.stratos.messaging.domain.applications.Application;
+import org.apache.stratos.messaging.domain.applications.ApplicationStatus;
+import org.apache.stratos.messaging.domain.applications.Group;
+import org.apache.stratos.messaging.domain.applications.GroupStatus;
 import org.apache.stratos.messaging.domain.instance.GroupInstance;
 import org.apache.stratos.messaging.domain.instance.Instance;
 import org.apache.stratos.messaging.domain.topology.ClusterStatus;
@@ -89,16 +95,16 @@ public class GroupMonitor extends ParentComponentMonitor 
implements EventHandler
         } else {
             // notify parent
             log.info("[Group] " + this.id + "is notifying the [parent] " + 
this.parent.getId());
-            if(this.isGroupScalingEnabled()) {
+            if (this.isGroupScalingEnabled()) {
                 ApplicationHolder.acquireReadLock();
                 try {
                     Application application = 
ApplicationHolder.getApplications().
-                                                                    
getApplication(this.appId);
-                    if(application != null) {
+                            getApplication(this.appId);
+                    if (application != null) {
                         //Notifying the parent using parent's instance Id,
                         // as it has group scaling enabled.
                         Group group = application.getGroupRecursively(this.id);
-                        if(group != null) {
+                        if (group != null) {
                             GroupInstance context = 
group.getInstanceContexts(instanceId);
                             
MonitorStatusEventBuilder.handleGroupStatusEvent(this.parent,
                                     status, this.id, context.getParentId());
@@ -114,7 +120,12 @@ public class GroupMonitor extends ParentComponentMonitor 
implements EventHandler
             }
         }
         //notify the children about the state change
-        MonitorStatusEventBuilder.notifyChildren(this, new 
GroupStatusEvent(status, getId(), null));
+        try {
+            MonitorStatusEventBuilder.notifyChildren(this, new 
GroupStatusEvent(status, this.id, instanceId));
+        } catch (ParentMonitorNotFoundException e) {
+            log.error("Error while notifying the children from the [group] " + 
this.id, e);
+            //TODO revert siblings
+        }
     }
 
     @Override
@@ -134,7 +145,7 @@ public class GroupMonitor extends ParentComponentMonitor 
implements EventHandler
             if (this.terminatingMonitorsList.contains(id)) {
                 this.terminatingMonitorsList.remove(id);
                 this.aliasToActiveMonitorsMap.remove(id);
-                
if(AutoscalerContext.getInstance().getClusterMonitors().containsKey(id)) {
+                if 
(AutoscalerContext.getInstance().getClusterMonitors().containsKey(id)) {
                     AutoscalerContext.getInstance().removeClusterMonitor(id);
                 }
             }
@@ -167,31 +178,32 @@ public class GroupMonitor extends ParentComponentMonitor 
implements EventHandler
     }
 
     @Override
-    public void onParentStatusEvent(MonitorStatusEvent statusEvent) {
+    public void onParentStatusEvent(MonitorStatusEvent statusEvent)
+                                throws ParentMonitorNotFoundException {
         String instanceId = statusEvent.getInstanceId();
         // send the ClusterTerminating event
         if (statusEvent.getStatus() == GroupStatus.Terminating ||
                 statusEvent.getStatus() == ApplicationStatus.Terminating) {
             ApplicationBuilder.handleGroupTerminatingEvent(appId, id, 
instanceId);
-        } else if(statusEvent.getStatus() == ClusterStatus.Created ||
-                                            statusEvent.getStatus() == 
GroupStatus.Created) {
+        } else if (statusEvent.getStatus() == ClusterStatus.Created ||
+                statusEvent.getStatus() == GroupStatus.Created) {
             Application application = 
ApplicationHolder.getApplications().getApplication(this.appId);
             Group group = application.getGroupRecursively(statusEvent.getId());
             //starting a new instance of this monitor
-            createGroupInstance(group, statusEvent.getInstanceId());
+            createInstanceAndStartDependency(group, 
statusEvent.getInstanceId());
         }
     }
 
     @Override
     public void onChildScalingEvent(MonitorScalingEvent scalingEvent) {
 
-        if(hasGroupScalingDependent){
+        if (hasGroupScalingDependent) {
 
             //notify parent
             parent.onChildScalingEvent(scalingEvent);
         }
 
-        if(log.isDebugEnabled()){
+        if (log.isDebugEnabled()) {
             log.debug("Child scaling event received to [group]: " + 
this.getId()
                     + ", [network partition]: " + 
scalingEvent.getNetworkPartitionId()
                     + ", [event] " + scalingEvent.getId() + ", [group 
instance] " + scalingEvent.getInstanceId());
@@ -202,13 +214,13 @@ public class GroupMonitor extends ParentComponentMonitor 
implements EventHandler
                 (GroupChildContext) 
scalingDependencyTree.findApplicationContextWithIdInScalingDependencyTree(id);
 
         //Notifying children, if this group has scaling dependencies
-        if (currentChildContextInScalingTree.isGroupScalingEnabled()){
-            for (ApplicationChildContext applicationChildContext : 
currentChildContextInScalingTree.getApplicationChildContextList()){
+        if (currentChildContextInScalingTree.isGroupScalingEnabled()) {
+            for (ApplicationChildContext applicationChildContext : 
currentChildContextInScalingTree.getApplicationChildContextList()) {
 
                 //Get group monitor so that it can notify it's children
                 Monitor monitor = 
aliasToActiveMonitorsMap.get(applicationChildContext.getId());
 
-                if(monitor instanceof GroupMonitor || monitor instanceof 
ApplicationMonitor){
+                if (monitor instanceof GroupMonitor || monitor instanceof 
ApplicationMonitor) {
 
                     monitor.onParentScalingEvent(scalingEvent);
                 }
@@ -238,22 +250,22 @@ public class GroupMonitor extends ParentComponentMonitor 
implements EventHandler
     public void startMinimumDependencies(Group group, List<String> 
parentInstanceIds)
             throws TopologyInConsistentException {
         int min = group.getGroupMinInstances();
-        if(group.getInstanceContextCount() >= min) {
+        if (group.getInstanceContextCount() >= min) {
             startDependency(group);
         } else {
-            if(group.getInstanceContextCount() > 0) {
+            if (group.getInstanceContextCount() > 0) {
                 List<String> instanceIds = new ArrayList<String>();
-                for(String parentInstanceId : parentInstanceIds) {
-                    List<Instance> contexts1 =  
group.getInstanceContextsWithParentId(parentInstanceId);
+                for (String parentInstanceId : parentInstanceIds) {
+                    List<Instance> contexts1 = 
group.getInstanceContextsWithParentId(parentInstanceId);
                     //Finding the non startable instance ids
-                    if(group.getInstanceContexts(parentInstanceId) == null || 
contexts1.isEmpty() ||
+                    if (group.getInstanceContexts(parentInstanceId) == null || 
contexts1.isEmpty() ||
                             contexts1.size() == 0) {
                         instanceIds.add(parentInstanceId);
 
                     }
                 }
-                if(instanceIds.size() > 0) {
-                    createInstanceAndStartDependency(group, parentInstanceIds);
+                if (instanceIds.size() > 0) {
+                    createInstanceAndStartDependency(group, instanceIds);
                 } else {
                     startDependency(group);
                 }
@@ -264,34 +276,35 @@ public class GroupMonitor extends ParentComponentMonitor 
implements EventHandler
         }
     }
 
-    private void createInstanceAndStartDependency(Group group, List<String> 
parentInstanceIds)
+    public void createInstanceAndStartDependency(Group group, List<String> 
parentInstanceIds)
             throws TopologyInConsistentException {
         List<String> instanceIds = new ArrayList<String>();
         String deploymentPolicyName = group.getDeploymentPolicy();
 
         String instanceId;
-        for(String parentInstanceId : parentInstanceIds) {
+        for (String parentInstanceId : parentInstanceIds) {
             Application application = 
ApplicationHolder.getApplications().getApplication(this.appId);
             Instance parentInstanceContext;
-            if(this.id.equals(appId)) {
-               parentInstanceContext = 
application.getInstanceContexts(parentInstanceId);
+            if (this.id.equals(appId)) {
+                parentInstanceContext = 
application.getInstanceContexts(parentInstanceId);
             } else {
                 Group group1 = 
application.getGroupRecursively(this.parent.getId());
                 parentInstanceContext = 
group1.getInstanceContexts(parentInstanceId);
             }
 
             GroupLevelNetworkPartitionContext 
groupLevelNetworkPartitionContext;
-            if(this.networkPartitionCtxts.containsKey(parentInstanceContext)) {
+            if (this.networkPartitionCtxts.containsKey(parentInstanceContext)) 
{
                 groupLevelNetworkPartitionContext = this.networkPartitionCtxts.
-                                            
get(parentInstanceContext.getNetworkPartitionId());
+                        get(parentInstanceContext.getNetworkPartitionId());
             } else {
                 groupLevelNetworkPartitionContext = new 
GroupLevelNetworkPartitionContext(
-                                                        
parentInstanceContext.getNetworkPartitionId(),
-                                                        null, null);
+                        parentInstanceContext.getNetworkPartitionId(),
+                        null, null);
                 
this.addNetworkPartitionContext(groupLevelNetworkPartitionContext);
             }
-
-            if(deploymentPolicyName != null) {
+            String partitionId = null;
+            String networkPartitionId = 
parentInstanceContext.getNetworkPartitionId();
+            if (deploymentPolicyName != null) {
                 DeploymentPolicy deploymentPolicy = PolicyManager.getInstance()
                         .getDeploymentPolicy(deploymentPolicyName);
                 NetworkPartition networkPartition = deploymentPolicy.
@@ -299,14 +312,56 @@ public class GroupMonitor extends ParentComponentMonitor 
implements EventHandler
 
                 AutoscaleAlgorithm algorithm = 
this.getAutoscaleAlgorithm(networkPartition.getPartitionAlgo());
                 //Partition partition = 
algorithm.getNextScaleUpPartition(groupLevelNetworkPartitionContext, this.id);
+                //TODO need to find the partition. partitionId=?
             }
-            instanceId = createGroupInstance(group, parentInstanceId);
+            instanceId = createGroupInstance(group, parentInstanceId, 
partitionId, networkPartitionId);
             instanceIds.add(instanceId);
         }
         startDependency(group, instanceIds);
     }
 
-    private String createGroupInstance(Group group, String parentInstanceId) {
+    public void createInstanceAndStartDependency(Group group, String 
parentInstanceId)
+            throws ParentMonitorNotFoundException {
+        String deploymentPolicyName = group.getDeploymentPolicy();
+
+        String instanceId;
+        Application application = 
ApplicationHolder.getApplications().getApplication(this.appId);
+        Instance parentInstanceContext;
+        if (this.id.equals(appId)) {
+            parentInstanceContext = 
application.getInstanceContexts(parentInstanceId);
+        } else {
+            Group group1 = 
application.getGroupRecursively(this.parent.getId());
+            parentInstanceContext = 
group1.getInstanceContexts(parentInstanceId);
+        }
+
+        GroupLevelNetworkPartitionContext groupLevelNetworkPartitionContext;
+        if (this.networkPartitionCtxts.containsKey(parentInstanceContext)) {
+            groupLevelNetworkPartitionContext = this.networkPartitionCtxts.
+                    get(parentInstanceContext.getNetworkPartitionId());
+        } else {
+            groupLevelNetworkPartitionContext = new 
GroupLevelNetworkPartitionContext(
+                    parentInstanceContext.getNetworkPartitionId(),
+                    null, null);
+            this.addNetworkPartitionContext(groupLevelNetworkPartitionContext);
+        }
+        String partitionId = null;
+        String networkPartitionId = 
parentInstanceContext.getNetworkPartitionId();
+        if (deploymentPolicyName != null) {
+            DeploymentPolicy deploymentPolicy = PolicyManager.getInstance()
+                    .getDeploymentPolicy(deploymentPolicyName);
+            NetworkPartition networkPartition = deploymentPolicy.
+                    
getNetworkPartition(parentInstanceContext.getNetworkPartitionId());
+
+            AutoscaleAlgorithm algorithm = 
this.getAutoscaleAlgorithm(networkPartition.getPartitionAlgo());
+            //Partition partition = 
algorithm.getNextScaleUpPartition(groupLevelNetworkPartitionContext, this.id);
+            //TODO need to find the partition. partitionId=?
+        }
+        instanceId = createGroupInstance(group, parentInstanceId, partitionId, 
networkPartitionId);
+        startDependency(group, instanceId);
+    }
+
+    private String createGroupInstance(Group group, String parentInstanceId, 
String partitionId,
+                                       String networkPartitionId) {
         String instanceId = parentInstanceId;
         int minGroupInstances = group.getGroupMinInstances();
         int maxGroupInstances = group.getGroupMaxInstances();
@@ -318,7 +373,8 @@ public class GroupMonitor extends ParentComponentMonitor 
implements EventHandler
             instanceId = this.generateInstanceId(group);
         }
         ApplicationBuilder.handleGroupInstanceCreatedEvent(appId, 
group.getUniqueIdentifier(),
-                                                            instanceId, 
parentInstanceId);
+                instanceId, parentInstanceId,
+                networkPartitionId, partitionId);
         return instanceId;
     }
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/9d474679/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 dacb654..56e2a63 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
@@ -84,7 +84,7 @@ public abstract class ParentComponentMonitor extends Monitor {
      * This will start the parallel dependencies at once from the top level.
      * it will get invoked when the monitor starts up only.
      */
-    public void startDependency(ParentComponent component, List<String> 
instanceIds) throws TopologyInConsistentException {
+    public void startDependency(ParentComponent component, List<String> 
instanceIds) {
         //start the first dependency
         List<ApplicationChildContext> applicationContexts = 
this.startupDependencyTree.
                 getStarAbleDependencies();
@@ -96,9 +96,8 @@ public abstract class ParentComponentMonitor extends Monitor {
      * This will start the parallel dependencies at once from the top level.
      * it will get invoked when the monitor starts up only.
      */
-    public void startDependency(ParentComponent component, String instanceId)
-                                                            throws 
TopologyInConsistentException,
-            ParentMonitorNotFoundException {
+    public void startDependency(ParentComponent component, String instanceId) 
throws
+                                                                    
ParentMonitorNotFoundException {
         //start the first dependency
         List<ApplicationChildContext> applicationContexts = 
this.startupDependencyTree.
                 getStarAbleDependencies();
@@ -110,7 +109,7 @@ public abstract class ParentComponentMonitor extends 
Monitor {
      * This will start the parallel dependencies at once from the top level.
      * it will get invoked when the monitor starts up only.
      */
-    public void startDependency(ParentComponent component) throws 
TopologyInConsistentException {
+    public void startDependency(ParentComponent component) {
         //start the first dependency
         List<ApplicationChildContext> applicationContexts = 
this.startupDependencyTree.
                 getStarAbleDependencies();
@@ -128,7 +127,7 @@ public abstract class ParentComponentMonitor extends 
Monitor {
      *
      * @param id alias/clusterId of which receive the activated event
      */
-    public boolean startDependency(String id, String instanceId) throws 
TopologyInConsistentException {
+    public boolean startDependency(String id, String instanceId) throws 
ParentMonitorNotFoundException {
         List<ApplicationChildContext> applicationContexts = 
this.startupDependencyTree
                 .getStarAbleDependencies(id);
         List<String> instanceIds = new ArrayList<String>();
@@ -136,7 +135,8 @@ public abstract class ParentComponentMonitor extends 
Monitor {
         return startDependency(applicationContexts, instanceIds);
     }
 
-    public boolean startAllChildrenDependency(ParentComponent component, 
String instanceId) throws TopologyInConsistentException {
+    public boolean startAllChildrenDependency(ParentComponent component, 
String instanceId)
+            throws TopologyInConsistentException {
         /*List<ApplicationChildContext> applicationContexts = 
this.startupDependencyTree
                 .findAllChildrenOfAppContext(id);*/
         return false;//startDependency(applicationContexts, instanceId);
@@ -162,7 +162,8 @@ public abstract class ParentComponentMonitor extends 
Monitor {
      *
      * @param applicationContexts the found applicationContexts to be started
      */
-    private boolean startDependency(List<ApplicationChildContext> 
applicationContexts, List<String> instanceIds) {
+    private boolean startDependency(List<ApplicationChildContext> 
applicationContexts,
+                                    List<String> instanceIds) {
         if (applicationContexts != null && applicationContexts.isEmpty()) {
             //all the groups/clusters have been started and waiting for 
activation
             log.info("There is no child found for the [group]: " + this.id);
@@ -176,17 +177,6 @@ public abstract class ParentComponentMonitor extends 
Monitor {
             if (!this.aliasToActiveMonitorsMap.containsKey(context.getId())) {
                 //to avoid if it is already started
                 startMonitor(this, context, instanceIds);
-            } else {
-                //starting a new instance of the child
-                Monitor monitor = 
aliasToActiveMonitorsMap.get(context.getId());
-                for (String instanceId : instanceIds) {
-                    if (context instanceof ClusterChildContext) {
-                        MonitorStatusEventBuilder.notifyChildCluster(monitor, 
ClusterStatus.Created, instanceId);
-                    } else if (context instanceof GroupChildContext) {
-                        MonitorStatusEventBuilder.notifyChildGroup(monitor, 
GroupStatus.Created, instanceId);
-                    }
-                }
-
             }
         }
 
@@ -261,7 +251,7 @@ public abstract class ParentComponentMonitor extends 
Monitor {
             if (!startDep) {
                 StatusChecker.getInstance().onChildStatusChange(eventId, 
this.id, this.appId, instanceId);
             }
-        } catch (TopologyInConsistentException e) {
+        } catch (ParentMonitorNotFoundException e) {
             //TODO revert the siblings and notify parent, change a flag for 
reverting/un-subscription
             log.error(e);
         }

http://git-wip-us.apache.org/repos/asf/stratos/blob/9d474679/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/ClusterStatusEvent.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/ClusterStatusEvent.java
 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/ClusterStatusEvent.java
index 1eca48a..1509a5c 100644
--- 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/ClusterStatusEvent.java
+++ 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/ClusterStatusEvent.java
@@ -20,6 +20,8 @@ package org.apache.stratos.autoscaler.monitor.events;
 
 import org.apache.stratos.messaging.domain.topology.ClusterStatus;
 
+import java.util.List;
+
 /**
  * This will use to notify observers upon a cluster activation events received 
in Topology.
  */
@@ -32,6 +34,11 @@ public class ClusterStatusEvent extends MonitorStatusEvent {
         this.status = status;
     }
 
+    public ClusterStatusEvent(ClusterStatus status, List<String> instanceIds, 
String id) {
+        super(instanceIds , id);
+        this.status = status;
+    }
+
     public ClusterStatus getStatus() {
         return this.status;
     }

http://git-wip-us.apache.org/repos/asf/stratos/blob/9d474679/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/GroupStatusEvent.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/GroupStatusEvent.java
 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/GroupStatusEvent.java
index 50c297b..2a6d1e4 100644
--- 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/GroupStatusEvent.java
+++ 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/GroupStatusEvent.java
@@ -20,6 +20,8 @@ package org.apache.stratos.autoscaler.monitor.events;
 
 import org.apache.stratos.messaging.domain.applications.GroupStatus;
 
+import java.util.List;
+
 /**
  * This will use to notify observers upon a group activation events received 
in Topology.
  */

http://git-wip-us.apache.org/repos/asf/stratos/blob/9d474679/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/MonitorEvent.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/MonitorEvent.java
 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/MonitorEvent.java
index 65c891a..7936e39 100644
--- 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/MonitorEvent.java
+++ 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/MonitorEvent.java
@@ -18,16 +18,24 @@
  */
 package org.apache.stratos.autoscaler.monitor.events;
 
+import java.util.List;
+
 public abstract class MonitorEvent {
     protected String id;
 
     protected String instanceId;
 
+    protected List<String> instanceIds;
+
     public MonitorEvent(String id , String instanceId) {
         this.id = id;
         this.instanceId = instanceId;
     }
 
+    public MonitorEvent(List<String> ids , String instanceId) {
+        this.instanceIds = ids;
+        this.instanceId = instanceId;
+    }
     public String getId(){
         return id;
     }

http://git-wip-us.apache.org/repos/asf/stratos/blob/9d474679/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/MonitorStatusEvent.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/MonitorStatusEvent.java
 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/MonitorStatusEvent.java
index f4ba558..8e1c89b 100644
--- 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/MonitorStatusEvent.java
+++ 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/MonitorStatusEvent.java
@@ -20,6 +20,8 @@ package org.apache.stratos.autoscaler.monitor.events;
 
 import org.apache.stratos.messaging.domain.topology.lifecycle.LifeCycleState;
 
+import java.util.List;
+
 /**
  * Monitor Status Event
  */
@@ -29,6 +31,10 @@ public abstract class MonitorStatusEvent extends 
MonitorEvent {
         super(id , instanceId);
     }
 
+    public MonitorStatusEvent(List<String> id, String instanceId) {
+        super(id , instanceId);
+    }
+
     public String getId() {
         return id;
     }

http://git-wip-us.apache.org/repos/asf/stratos/blob/9d474679/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/builder/MonitorStatusEventBuilder.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/builder/MonitorStatusEventBuilder.java
 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/builder/MonitorStatusEventBuilder.java
index 9ce891b..78fd308 100644
--- 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/builder/MonitorStatusEventBuilder.java
+++ 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/builder/MonitorStatusEventBuilder.java
@@ -20,6 +20,8 @@ package org.apache.stratos.autoscaler.monitor.events.builder;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import 
org.apache.stratos.autoscaler.exception.application.ParentMonitorNotFoundException;
+import 
org.apache.stratos.autoscaler.exception.application.TopologyInConsistentException;
 import org.apache.stratos.autoscaler.monitor.Monitor;
 import org.apache.stratos.autoscaler.monitor.component.ParentComponentMonitor;
 import org.apache.stratos.autoscaler.monitor.events.*;
@@ -27,6 +29,8 @@ import 
org.apache.stratos.messaging.domain.applications.ApplicationStatus;
 import org.apache.stratos.messaging.domain.topology.ClusterStatus;
 import org.apache.stratos.messaging.domain.applications.GroupStatus;
 
+import java.util.List;
+
 /**
  * This will build the necessary monitor status events to be sent to the 
parent/child  monitor
  */
@@ -62,18 +66,32 @@ public class MonitorStatusEventBuilder {
         parent.onChildStatusEvent(statusEvent);
     }
 
-    public static void notifyChildren (ParentComponentMonitor 
componentMonitor, MonitorStatusEvent statusEvent) {
+    public static void notifyChildren (ParentComponentMonitor 
componentMonitor, MonitorStatusEvent statusEvent)
+                                                            throws 
ParentMonitorNotFoundException {
         for (Monitor activeChildMonitor : 
componentMonitor.getAliasToActiveMonitorsMap().values()) {
             activeChildMonitor.onParentStatusEvent(statusEvent);
         }
     }
 
-    public static void notifyChildGroup(Monitor child, GroupStatus state, 
String instanceId) {
+    public static void notifyChildGroup(Monitor child, GroupStatus state, 
String instanceId)
+                                                            throws 
ParentMonitorNotFoundException {
         MonitorStatusEvent statusEvent = new GroupStatusEvent(state, 
child.getId(), instanceId);
         child.onParentStatusEvent(statusEvent);
     }
 
-    public static void notifyChildCluster(Monitor child, ClusterStatus state, 
String instanceId) {
+    /*public static void notifyChildCluster(Monitor child, ClusterStatus 
state, List<String> instanceId) {
+        MonitorStatusEvent statusEvent = new ClusterStatusEvent(state, 
instanceId, child.getId());
+        child.onParentStatusEvent(statusEvent);
+    }
+
+    public static void notifyChildGroup(Monitor child, GroupStatus state, 
List<String> instanceIds)
+            throws ParentMonitorNotFoundException {
+        MonitorStatusEvent statusEvent = new GroupStatusEvent(state, 
child.getId(), instanceIds);
+        child.onParentStatusEvent(statusEvent);
+    }*/
+
+    public static void notifyChildCluster(Monitor child, ClusterStatus state, 
String instanceId)
+            throws ParentMonitorNotFoundException {
         MonitorStatusEvent statusEvent = new ClusterStatusEvent(state, 
child.getId(), instanceId);
         child.onParentStatusEvent(statusEvent);
     }

http://git-wip-us.apache.org/repos/asf/stratos/blob/9d474679/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 8654970..a843b33 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,7 +26,8 @@ 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);
@@ -53,4 +54,12 @@ public class ClusterInstance extends Instance<ClusterStatus> 
implements LifeCycl
     public boolean setStatus(ClusterStatus newState) {
         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/9d474679/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 fc3eea5..dd28fc3 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,6 +26,8 @@ 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);
@@ -52,4 +54,12 @@ public class GroupInstance extends Instance<GroupStatus> 
implements LifeCycleSta
     public boolean setStatus(GroupStatus newState) {
         return this.lifeCycleStateManager.changeState(newState);
     }
+
+    public String getPartitionId() {
+        return partitionId;
+    }
+
+    public void setPartitionId(String partitionId) {
+        this.partitionId = partitionId;
+    }
 }

Reply via email to