adding support for group scaling

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

Branch: refs/heads/master
Commit: fc3238e041629b74517b0f46b0276e656e2e17e1
Parents: 586ab74
Author: reka <[email protected]>
Authored: Tue Dec 16 17:24:14 2014 +0530
Committer: Udara Liyanage <[email protected]>
Committed: Thu Dec 18 12:06:57 2014 +0530

----------------------------------------------------------------------
 .../dependency/DependencyBuilder.java           |  55 +++----
 .../autoscaler/context/InstanceContext.java     |  10 ++
 .../context/group/GroupInstanceContext.java     |   8 +
 .../autoscaler/monitor/EventHandler.java        |   7 -
 .../stratos/autoscaler/monitor/Monitor.java     |   2 +-
 .../monitor/cluster/AbstractClusterMonitor.java |   5 -
 .../monitor/cluster/VMClusterMonitor.java       |  14 +-
 .../monitor/component/ApplicationMonitor.java   |  13 +-
 .../monitor/component/GroupMonitor.java         | 158 +++++++++++++++----
 .../component/ParentComponentMonitor.java       |   2 +-
 .../autoscaler/monitor/events/ScalingEvent.java |   8 +-
 .../monitor/events/ScalingOverMaxEvent.java     |   8 +-
 .../builder/MonitorStatusEventBuilder.java      |  11 +-
 13 files changed, 198 insertions(+), 103 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/fc3238e0/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/DependencyBuilder.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/DependencyBuilder.java
 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/DependencyBuilder.java
index 7dd9c2a..98d2dc4 100644
--- 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/DependencyBuilder.java
+++ 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/DependencyBuilder.java
@@ -26,9 +26,7 @@ import 
org.apache.stratos.autoscaler.applications.dependency.context.Application
 import 
org.apache.stratos.autoscaler.exception.application.DependencyBuilderException;
 import org.apache.stratos.messaging.domain.applications.*;
 
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
+import java.util.*;
 
 /**
  * This is to build the startup/termination dependencies
@@ -161,30 +159,33 @@ public class DependencyBuilder {
      * Utility method to build scaling dependencies
      * 
      */
-//     public Set<String> buildScalingDependencies(ParentComponent component) {
-//             log.info(" ******* in build scaling dependencies ************ 
"); // TODO - remove
-//             Set<String> scalingDependencies = new HashSet<String>();
-//             if(component.getDependencyOrder() != null && 
component.getDependencyOrder().getScalingDependents() != null) {
-//                     log.info(" ******* in build scaling dependencies 22 
************ "); // TODO - remove
-//             for (String string : 
component.getDependencyOrder().getScalingDependents()) {
-//
-//                     log.info(" ******* in build scaling dependencies 33 
************ "); // TODO - remove
-//                     if (string.startsWith(Constants.GROUP + ".")) {
-//                         //getting the group alias
-//                         
scalingDependencies.add(getGroupFromStartupOrder(string));
-//                     } else if (string.startsWith(Constants.CARTRIDGE + 
".")) {
-//                         //getting the cluster alias
-//                         String id = getClusterFromStartupOrder(string);
-//                         //getting the cluster-id from cluster alias
-//                         ClusterDataHolder clusterDataHolder = 
(ClusterDataHolder) component.getClusterDataMap().get(id);
-//                         
scalingDependencies.add(clusterDataHolder.getClusterId());
-//                     } else {
-//                         log.warn("[Scaling Dependency]: " + string + " 
contains unknown reference");
-//                     }
-//        }
-//             }
-//         return scalingDependencies;
-//    }
+       public Set<ScalingDependentList> 
buildScalingDependencies(ParentComponent component) {
+               Set<ScalingDependentList> scalingDependentLists = new 
HashSet<ScalingDependentList>();
+               if(component.getDependencyOrder() != null && 
component.getDependencyOrder().getScalingDependents() != null) {
+               for (ScalingDependentList dependentList : 
component.getDependencyOrder().getScalingDependents()) {
+            List<String> scalingDependencies = new ArrayList<String>();
+            for(String string : 
dependentList.getScalingDependentListComponents()) {
+                if (string.startsWith(Constants.GROUP + ".")) {
+                    //getting the group alias
+                    scalingDependencies.add(getGroupFromStartupOrder(string));
+                } else if (string.startsWith(Constants.CARTRIDGE + ".")) {
+                    //getting the cluster alias
+                    String id = getClusterFromStartupOrder(string);
+                    //getting the cluster-id from cluster alias
+                    ClusterDataHolder clusterDataHolder = (ClusterDataHolder) 
component.getClusterDataMap().get(id);
+                    scalingDependencies.add(clusterDataHolder.getClusterId());
+                } else {
+                    log.warn("[Scaling Dependency]: " + string + " contains 
unknown reference");
+                }
+            }
+            ScalingDependentList scalingDependentList = new 
ScalingDependentList(scalingDependencies);
+            scalingDependentLists.add(scalingDependentList);
+
+
+        }
+               }
+           return scalingDependentLists;
+    }
 
     /**
      * Utility method to get the group alias from the startup order Eg: 
group.mygroup

http://git-wip-us.apache.org/repos/asf/stratos/blob/fc3238e0/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/InstanceContext.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/InstanceContext.java
 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/InstanceContext.java
index ce23ec3..8d4ef27 100644
--- 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/InstanceContext.java
+++ 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/InstanceContext.java
@@ -24,6 +24,8 @@ package org.apache.stratos.autoscaler.context;
 public abstract class InstanceContext {
     protected String id;
 
+    protected String parentInstanceId;
+
     public InstanceContext(String id) {
         this.id = id;
     }
@@ -35,4 +37,12 @@ public abstract class InstanceContext {
     public void setId(String id) {
         this.id = id;
     }
+
+    public String getParentInstanceId() {
+        return parentInstanceId;
+    }
+
+    public void setParentInstanceId(String parentInstanceId) {
+        this.parentInstanceId = parentInstanceId;
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/fc3238e0/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/group/GroupInstanceContext.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/group/GroupInstanceContext.java
 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/group/GroupInstanceContext.java
index c7cbbe6..1f4ae6f 100644
--- 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/group/GroupInstanceContext.java
+++ 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/group/GroupInstanceContext.java
@@ -111,6 +111,14 @@ public class GroupInstanceContext extends InstanceContext {
         this.idToScalingEvent.put(scalingEvent.getId(), scalingEvent);
     }
 
+    public ScalingEvent getScalingEvent(String id) {
+        return this.idToScalingEvent.get(id);
+    }
+
+    public ScalingOverMaxEvent getScalingMaxEvent(String id) {
+        return this.idToScalingOverMaxEvent.get(id);
+    }
+
     public void removeScalingOverMaxEvent(String id) {
         this.idToScalingOverMaxEvent.remove(id);
     }

http://git-wip-us.apache.org/repos/asf/stratos/blob/fc3238e0/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 7805a13..6cd48e1 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
@@ -62,11 +62,4 @@ public interface EventHandler {
      * @param scalingEvent
      */
     public abstract void onParentScalingEvent(ScalingEvent scalingEvent);
-
-    /**
-     * Triggered when scaling decision is made.
-     *
-     * @param scalingEvent
-     */
-    public abstract void onEvent(ScalingEvent scalingEvent);
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/fc3238e0/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/Monitor.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/Monitor.java
 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/Monitor.java
index 25e54a1..5154b2b 100644
--- 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/Monitor.java
+++ 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/Monitor.java
@@ -43,7 +43,7 @@ public abstract class Monitor implements EventHandler {
 
     public abstract void destroy();
 
-    public abstract void createInstanceOnDemand(String instanceId);
+    public abstract boolean createInstanceOnDemand(String instanceId);
 
     public Monitor() {
         this.instanceIdToInstanceMap = new HashMap<String, Instance>();

http://git-wip-us.apache.org/repos/asf/stratos/blob/fc3238e0/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/AbstractClusterMonitor.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/AbstractClusterMonitor.java
 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/AbstractClusterMonitor.java
index 9d44b6c..eb94e8d 100644
--- 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/AbstractClusterMonitor.java
+++ 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/AbstractClusterMonitor.java
@@ -328,11 +328,6 @@ public abstract class AbstractClusterMonitor extends 
Monitor implements Runnable
 
     }
 
-    @Override
-    public void onEvent(ScalingEvent scalingEvent) {
-
-    }
-
     public boolean isHasFaultyMember() {
         return hasFaultyMember;
     }

http://git-wip-us.apache.org/repos/asf/stratos/blob/fc3238e0/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/VMClusterMonitor.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/VMClusterMonitor.java
 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/VMClusterMonitor.java
index 3ee14d2..8bdbf0a 100644
--- 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/VMClusterMonitor.java
+++ 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/VMClusterMonitor.java
@@ -442,13 +442,13 @@ public class VMClusterMonitor extends 
AbstractClusterMonitor {
 
     public void sendClusterScalingEvent(String networkPartitionId, String 
instanceId, float factor) {
 
-        MonitorStatusEventBuilder.handleClusterScalingEvent(this.parent, 
networkPartitionId, instanceId, factor, this.id, serviceType);
+        MonitorStatusEventBuilder.handleClusterScalingEvent(this.parent, 
networkPartitionId, instanceId, factor, this.id);
     }
 
     public void sendScalingOverMaxEvent(String networkPartitionId, String 
instanceId) {
 
         MonitorStatusEventBuilder.handleScalingOverMaxEvent(this.parent, 
networkPartitionId, instanceId,
-                this.id, serviceType);
+                this.id);
     }
 
     @Override
@@ -1119,11 +1119,11 @@ public class VMClusterMonitor extends 
AbstractClusterMonitor {
 
     }
 
-    public void createInstanceOnDemand(String instanceId) {
+    public boolean createInstanceOnDemand(String instanceId) {
         Cluster cluster = 
TopologyManager.getTopology().getService(this.serviceType).
                 getCluster(this.clusterId);
         try {
-            createInstance(instanceId, cluster);
+            return createInstance(instanceId, cluster);
             //TODO exception
         } catch (PolicyValidationException e) {
             log.error("Error while creating the cluster instance", e);
@@ -1131,10 +1131,11 @@ public class VMClusterMonitor extends 
AbstractClusterMonitor {
             log.error("Error while creating the cluster instance", e);
 
         }
+        return false;
 
     }
 
-    private void createInstance(String parentInstanceId, Cluster cluster)
+    private boolean createInstance(String parentInstanceId, Cluster cluster)
             throws PolicyValidationException, PartitionValidationException {
         Instance parentMonitorInstance = 
this.parent.getInstance(parentInstanceId);
         String partitionId = null;
@@ -1178,9 +1179,12 @@ public class VMClusterMonitor extends 
AbstractClusterMonitor {
             } else {
                 createClusterInstance(cluster.getServiceName(), 
cluster.getClusterId(), null, parentInstanceId, partitionId,
                         parentMonitorInstance.getNetworkPartitionId());
+
             }
+            return true;
 
         } else {
+            return false;
 
         }
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/fc3238e0/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 3184e81..69eb68e 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
@@ -188,7 +188,7 @@ public class ApplicationMonitor extends 
ParentComponentMonitor {
 
         //find the child context of this group,
         //Notifying children, if this group has scaling dependencies
-        if(scalingDependencies != null && !scalingDependencies.isEmpty()) {
+        /*if(scalingDependencies != null && !scalingDependencies.isEmpty()) {
             // has dependencies. Notify children
             if (aliasToActiveMonitorsMap != null && 
!aliasToActiveMonitorsMap.values().isEmpty()) {
 
@@ -217,11 +217,12 @@ public class ApplicationMonitor extends 
ParentComponentMonitor {
                     }
                 }
             }
-        }
+        }*/
     }
 
     @Override
     public void onChildScalingOverMaxEvent(ScalingOverMaxEvent 
scalingOverMaxEvent) {
+        //TODO to check for the capability of cloud bursting
 
     }
 
@@ -230,11 +231,6 @@ public class ApplicationMonitor extends 
ParentComponentMonitor {
 
     }
 
-    @Override
-    public void onEvent(ScalingEvent scalingEvent) {
-
-    }
-
     public boolean startMinimumDependencies(Application application)
             throws TopologyInConsistentException, PolicyValidationException {
 
@@ -417,7 +413,8 @@ public class ApplicationMonitor extends 
ParentComponentMonitor {
     }
 
     @Override
-    public void createInstanceOnDemand(String instanceId) {
+    public boolean createInstanceOnDemand(String instanceId) {
+        return false;
 
     }
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/fc3238e0/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 500a0ff..62b33c2 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
@@ -48,10 +48,7 @@ import org.apache.stratos.messaging.domain.instance.Instance;
 import org.apache.stratos.messaging.domain.topology.ClusterStatus;
 import org.apache.stratos.messaging.domain.topology.lifecycle.LifeCycleState;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
@@ -82,7 +79,8 @@ public class GroupMonitor extends ParentComponentMonitor 
implements Runnable {
      * @throws DependencyBuilderException    throws when couldn't build the 
Topology
      * @throws TopologyInConsistentException throws when topology is 
inconsistent
      */
-    public GroupMonitor(Group group, String appId, List<String> 
parentInstanceId, boolean hasScalingDependents) throws 
DependencyBuilderException,
+    public GroupMonitor(Group group, String appId, List<String> 
parentInstanceId,
+                        boolean hasScalingDependents) throws 
DependencyBuilderException,
             TopologyInConsistentException {
         super(group);
         this.groupScalingEnabled = group.isGroupScalingEnabled();
@@ -112,21 +110,107 @@ public class GroupMonitor extends ParentComponentMonitor 
implements Runnable {
     }
 
     public void monitor() {
+        final Collection<GroupLevelNetworkPartitionContext> 
networkPartitionContexts =
+                this.networkPartitionCtxts.values();
 
         Runnable monitoringRunnable = new Runnable() {
             @Override
             public void run() {
-                float finalFactor = 1;
                 if (log.isDebugEnabled()) {
                     log.debug("Group monitor is running====== : " + 
this.toString());
                 }
+                for (GroupLevelNetworkPartitionContext networkPartitionContext 
: networkPartitionContexts) {
+
+                    for (GroupInstanceContext instanceContext : 
networkPartitionContext.
+                            getInstanceIdToInstanceContextMap().values()) {
+                        GroupInstance instance = (GroupInstance) 
instanceIdToInstanceMap.
+                                get(instanceContext.getId());
+                        //stopping the monitoring when the group is 
inactive/Terminating/Terminated
+                        if (instance.getStatus().getCode() <= 
GroupStatus.Active.getCode()) {
+                            //Gives priority to scaling max out rather than 
dependency scaling
+                            if 
(!instanceContext.getIdToScalingOverMaxEvent().isEmpty()) {
+                                //handling the group scaling
+                                if (groupScalingEnabled) {
+                                    //one of the child is loaded and max out.
+                                    // Hence creating new group instance
+                                    boolean createOnDemand = 
createInstanceOnDemand(instanceContext.
+                                            getParentInstanceId());
+                                    if (!createOnDemand) {
+                                        //couldn't create new instance. Hence 
notifying the parent
+                                        
MonitorStatusEventBuilder.handleScalingOverMaxEvent(parent,
+                                                
networkPartitionContext.getId(),
+                                                instanceContext.getId(),
+                                                appId);
+                                    } else {
+                                        //Resetting the max events
+                                        
instanceContext.setIdToScalingOverMaxEvent(
+                                                new HashMap<String, 
ScalingOverMaxEvent>());
+                                    }
+                                } else {
+                                    //notifying the parent if no group scaling 
enabled here
+                                    
MonitorStatusEventBuilder.handleScalingOverMaxEvent(parent,
+                                            networkPartitionContext.getId(),
+                                            instanceContext.getId(),
+                                            appId);
+                                }
+                            } else {
+                                /**
+                                 * Dependency scaling handling
+                                 * Finding out the highest scaling events 
within the scaling dependencies
+                                 */
+                                List<ScalingEvent> 
highestScalingEventOfDependencies = new ArrayList<ScalingEvent>();
+                                for (ScalingDependentList scalingDependentList 
: scalingDependencies) {
+                                    ScalingEvent highestFactorEvent = null;
+                                    for (String scalingDependentListComponent 
: scalingDependentList.
+                                            
getScalingDependentListComponents()) {
+                                        ScalingEvent scalingEvent = 
instanceContext.
+                                                
getScalingEvent(scalingDependentListComponent);
+                                        if (highestFactorEvent == null) {
+                                            highestFactorEvent = scalingEvent;
+                                        } else {
+                                            if (scalingEvent.getFactor() > 
highestFactorEvent.getFactor()) {
+                                                highestFactorEvent = 
scalingEvent;
+                                            }
+                                        }
+                                    }
+                                    
highestScalingEventOfDependencies.add(highestFactorEvent);
+                                }
+
+                                for (ScalingEvent highestScalingEventOfChild : 
highestScalingEventOfDependencies) {
+                                    //find the child context of this group,
+                                    //Notifying children, if this group has 
scaling dependencies
+                                    if (scalingDependencies != null && 
!scalingDependencies.isEmpty()) {
+                                        for (ScalingDependentList 
scalingDependentList : scalingDependencies) {
+                                            if 
(scalingDependentList.getScalingDependentListComponents().
+                                                    
contains(highestScalingEventOfChild.getId())) {
+                                                for (String 
scalingDependentListComponent : scalingDependentList
+                                                        
.getScalingDependentListComponents()) {
+                                                    Monitor monitor = 
aliasToActiveMonitorsMap.get(
+                                                            
scalingDependentListComponent);
+                                                    if (monitor instanceof 
GroupMonitor ||
+                                                            monitor instanceof 
VMClusterMonitor) {
+                                                        ScalingEvent 
scalingEvent = new ScalingEvent(monitor.getId(),
+                                                                
networkPartitionContext.getId(),
+                                                                
instanceContext.getId(),
+                                                                
highestScalingEventOfChild.getFactor());
+                                                        
monitor.onParentScalingEvent(scalingEvent);
+                                                    }
+                                                }
+                                            }
+                                            break;
+                                        }
+                                    }
+                                }
+                                //Resetting the events
+                                instanceContext.setIdToScalingEvent(new 
HashMap<String, ScalingEvent>());
+                            }
+                        }
+
+
+                    }
+
 
-                               /*Collection<ScalingEvent> events = 
mapScalingEvent.values();
-                for (ScalingEvent event : events) {
-                    log.info("Monitor Scaling Event"+event.getId());
                 }
-                //TODO : call the on demand group scaling
-                mapScalingEvent.clear();*/
             }
         };
         monitoringRunnable.run();
@@ -171,13 +255,12 @@ public class GroupMonitor extends ParentComponentMonitor 
implements Runnable {
                 ApplicationHolder.releaseReadLock();
             }
         } else {
-            // notify parent
+            // notifying the parent
             log.info("[Group] " + this.id + "is notifying the [parent] " + 
this.parent.getId() +
                     " [instance] " + instanceId);
             MonitorStatusEventBuilder.handleGroupStatusEvent(this.parent,
                     status, this.id, instanceId);
         }
-        //}
         //notify the children about the state change
         try {
             MonitorStatusEventBuilder.notifyChildren(this, new 
GroupStatusEvent(status, this.id, instanceId));
@@ -193,7 +276,6 @@ public class GroupMonitor extends ParentComponentMonitor 
implements Runnable {
         String instanceId = statusEvent.getInstanceId();
         LifeCycleState status1 = statusEvent.getStatus();
         //Events coming from parent are In_Active(in faulty detection), 
Scaling events, termination
-
         if (status1 == GroupStatus.Active) {
             //Verifying whether all the minimum no of instances of child
             // became active to take next action
@@ -208,13 +290,9 @@ public class GroupMonitor extends ParentComponentMonitor 
implements Runnable {
             onChildActivatedEvent(childId, instanceId);
 
         } else if (status1 == ClusterStatus.Inactive || status1 == 
GroupStatus.Inactive) {
-            //TODO handling restart of stratos
-            /*if 
(!aliasToActiveMonitorsMap.get(childId).hasStartupDependents()) {
-                onChildActivatedEvent(childId, instanceId);
-            } else {*/
+            //TODO handling restart of stratos when group is inactive
             markInstanceAsInactive(childId, instanceId);
             onChildInactiveEvent(childId, instanceId);
-            //}
 
         } else if (status1 == ClusterStatus.Terminating || status1 == 
GroupStatus.Terminating) {
             //mark the child monitor as inactive in the map
@@ -309,7 +387,8 @@ public class GroupMonitor extends ParentComponentMonitor 
implements Runnable {
 
         //find the child context of this group,
         //Notifying children, if this group has scaling dependencies
-        if (scalingDependencies != null && !scalingDependencies.isEmpty()) {
+        //TODO will be handled by the periodic task
+        /*if (scalingDependencies != null && !scalingDependencies.isEmpty()) {
             // has dependencies. Notify children
             if (aliasToActiveMonitorsMap != null && 
!aliasToActiveMonitorsMap.values().isEmpty()) {
 
@@ -336,7 +415,7 @@ public class GroupMonitor extends ParentComponentMonitor 
implements Runnable {
                 }
             }
         }
-
+*/
         String networkPartitionId = scalingEvent.getNetworkPartitionId();
         String instanceId = scalingEvent.getInstanceId();
         String id = scalingEvent.getId();
@@ -382,13 +461,28 @@ public class GroupMonitor extends ParentComponentMonitor 
implements Runnable {
 
     @Override
     public void onParentScalingEvent(ScalingEvent scalingEvent) {
-
-        //Notify all children about scaling
-    }
-
-    @Override
-    public void onEvent(ScalingEvent scalingEvent) {
-
+        //Notifying children, if this group has scaling dependencies
+        if (scalingDependencies != null && !scalingDependencies.isEmpty()) {
+            for (ScalingDependentList scalingDependentList : 
scalingDependencies) {
+                if (scalingDependentList.getScalingDependentListComponents().
+                        contains(scalingEvent.getId())) {
+                    for (String scalingDependentListComponent : 
scalingDependentList
+                            .getScalingDependentListComponents()) {
+                        Monitor monitor = aliasToActiveMonitorsMap.get(
+                                scalingDependentListComponent);
+                        if (monitor instanceof GroupMonitor ||
+                                monitor instanceof VMClusterMonitor) {
+                            ScalingEvent childScalingEvent = new 
ScalingEvent(monitor.getId(),
+                                    monitor.getId(),
+                                    scalingEvent.getInstanceId(),
+                                    scalingEvent.getFactor());
+                            monitor.onParentScalingEvent(childScalingEvent);
+                        }
+                    }
+                }
+                break;
+            }
+        }
     }
 
     public boolean isGroupScalingEnabled() {
@@ -545,6 +639,7 @@ public class GroupMonitor extends ParentComponentMonitor 
implements Runnable {
 
         String instanceId = groupInstance.getInstanceId();
         GroupInstanceContext groupInstanceContext = new 
GroupInstanceContext(instanceId);
+        groupInstanceContext.setParentInstanceId(groupInstance.getParentId());
 
         groupInstanceContext.addPartitionContext((GroupLevelPartitionContext) 
partitionContext);
         
groupLevelNetworkPartitionContext.addInstanceContext(groupInstanceContext);
@@ -659,7 +754,7 @@ public class GroupMonitor extends ParentComponentMonitor 
implements Runnable {
      * @param parentInstanceId
      * @throws 
org.apache.stratos.autoscaler.exception.application.MonitorNotFoundException
      */
-    public void createInstanceOnDemand(String parentInstanceId) {
+    public boolean createInstanceOnDemand(String parentInstanceId) {
         // Get parent instance context
         Instance parentInstanceContext = 
getParentInstanceContext(parentInstanceId);
         List<String> instanceIdsToStart = new ArrayList<String>();
@@ -715,6 +810,10 @@ public class GroupMonitor extends ParentComponentMonitor 
implements Runnable {
                         "[max] " + groupMax + ". Hence trying to notify the 
parent.");
             }
         }
+        boolean startedOnDemand = false;
+        if (!instanceIdsToStart.isEmpty()) {
+            startedOnDemand = true;
+        }
         //TODO Starting all the instances, can do in parallel
         for (String instanceId : instanceIdsToStart) {
             try {
@@ -724,6 +823,7 @@ public class GroupMonitor extends ParentComponentMonitor 
implements Runnable {
                 log.error("Error while creating the group/cluster instance", 
e);
             }
         }
+        return startedOnDemand;
     }
 
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/fc3238e0/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 e9f20c9..00ec33a 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
@@ -89,7 +89,7 @@ public abstract class ParentComponentMonitor extends Monitor {
         startupDependencyTree = 
DependencyBuilder.getInstance().buildDependency(component);
         //Building the scaling dependencies for this monitor within the 
immediate children
         if(component.getDependencyOrder() != null) {
-            scalingDependencies  =  
component.getDependencyOrder().getScalingDependents();
+            scalingDependencies  =  
DependencyBuilder.getInstance().buildScalingDependencies(component);
         }
         //Create the executor service with identifier and thread pool size
            executorService = StratosThreadPool.getExecutorService(IDENTIFIER, 
THREAD_POOL_SIZE);

http://git-wip-us.apache.org/repos/asf/stratos/blob/fc3238e0/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/ScalingEvent.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/ScalingEvent.java
 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/ScalingEvent.java
index f5141cf..da96ecd 100644
--- 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/ScalingEvent.java
+++ 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/ScalingEvent.java
@@ -25,13 +25,11 @@ public class ScalingEvent extends MonitorEvent {
 
     private float factor;
     private String networkPartitionId;
-    private String serviceName;
 
-    public ScalingEvent(String id, String networkPartitionId, String 
instanceId, float factor, String serviceName) {
+    public ScalingEvent(String id, String networkPartitionId, String 
instanceId, float factor) {
         super(id, instanceId);
         this.factor = factor;
         this.networkPartitionId = networkPartitionId;
-        this.serviceName = serviceName;
     }
 
     public float getFactor() {
@@ -49,8 +47,4 @@ public class ScalingEvent extends MonitorEvent {
     public void setNetworkPartitionId(String networkPartitionId) {
         this.networkPartitionId = networkPartitionId;
     }
-
-    public String getServiceName() {
-        return serviceName;
-    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/fc3238e0/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/ScalingOverMaxEvent.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/ScalingOverMaxEvent.java
 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/ScalingOverMaxEvent.java
index dc5409d..cee7909 100644
--- 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/ScalingOverMaxEvent.java
+++ 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/ScalingOverMaxEvent.java
@@ -24,12 +24,10 @@ package org.apache.stratos.autoscaler.monitor.events;
 public class ScalingOverMaxEvent extends MonitorEvent {
 
     private String networkPartitionId;
-    private String serviceName;
 
-    public ScalingOverMaxEvent(String id, String networkPartitionId, String 
instanceId, String serviceName) {
+    public ScalingOverMaxEvent(String id, String networkPartitionId, String 
instanceId) {
         super(id, instanceId);
         this.networkPartitionId = networkPartitionId;
-        this.serviceName = serviceName;
     }
 
     public String getNetworkPartitionId() {
@@ -39,8 +37,4 @@ public class ScalingOverMaxEvent extends MonitorEvent {
     public void setNetworkPartitionId(String networkPartitionId) {
         this.networkPartitionId = networkPartitionId;
     }
-
-    public String getServiceName() {
-        return serviceName;
-    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/fc3238e0/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 a46114a..3c1c665 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
@@ -54,21 +54,20 @@ public class MonitorStatusEventBuilder {
 
     public static void handleClusterScalingEvent(ParentComponentMonitor parent,
                                                  String networkPartitionId, 
String instanceId, float factor,
-                                                 String appId, String 
serviceName) {
+                                                 String appId) {
 
         //Send notifications to parent of the cluster monitor
-        ScalingEvent scalingEvent = new ScalingEvent(appId, 
networkPartitionId, instanceId, factor,
-                serviceName) ;
+        ScalingEvent scalingEvent = new ScalingEvent(appId, 
networkPartitionId, instanceId, factor) ;
         notifyParent(parent, scalingEvent);
     }
 
     public static void handleScalingOverMaxEvent(ParentComponentMonitor parent,
                                                  String networkPartitionId, 
String instanceId,
-                                                 String appId, String 
serviceName) {
+                                                 String appId) {
 
         //Send notifications to parent of the cluster monitor
-        ScalingOverMaxEvent scalingOverMaxEvent = new 
ScalingOverMaxEvent(appId, networkPartitionId, instanceId,
-                serviceName) ;
+        ScalingOverMaxEvent scalingOverMaxEvent = new 
ScalingOverMaxEvent(appId, networkPartitionId,
+                                                            instanceId) ;
         notifyParent(parent, scalingOverMaxEvent);
     }
 

Reply via email to