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/16 12:57:38 UTC

[1/6] stratos git commit: refactoring and fixing instance communication issue when having more than one instance

Repository: stratos
Updated Branches:
  refs/heads/4.1.0-test cbc02ad41 -> 66bc3acf3


refactoring and fixing instance communication issue when having more than one instance


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

Branch: refs/heads/4.1.0-test
Commit: 2d9dceb56367345e82b212dddc26c302b983faff
Parents: dad6aa5
Author: reka <rt...@gmail.com>
Authored: Tue Dec 16 14:47:08 2014 +0530
Committer: reka <rt...@gmail.com>
Committed: Tue Dec 16 17:27:20 2014 +0530

----------------------------------------------------------------------
 .../parser/DefaultApplicationParser.java        |   4 +-
 .../applications/topic/ApplicationBuilder.java  | 106 ++++++++++---------
 .../monitor/cluster/VMClusterMonitor.java       |   4 +-
 .../monitor/component/GroupMonitor.java         |  26 +++--
 .../processor/group/GroupStatusProcessor.java   |   4 +-
 .../group/GroupStatusProcessorChain.java        |   5 +-
 6 files changed, 82 insertions(+), 67 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/2d9dceb5/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/parser/DefaultApplicationParser.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/parser/DefaultApplicationParser.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/parser/DefaultApplicationParser.java
index fbde278..6d7db2b 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/parser/DefaultApplicationParser.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/parser/DefaultApplicationParser.java
@@ -651,8 +651,8 @@ public class DefaultApplicationParser implements ApplicationParser {
         PayloadData payloadData = ApplicationUtils.createPayload(appId, groupName, cartridgeInfo, subscriptionKey, tenantId, clusterId,
                 hostname, repoUrl, alias, null, dependencyAliases, properties);
 
-        //String oAuth_token = createToken(appId);
-        //payloadData.add(TOKEN_PAYLOD_PARAM_NAME, oAuth_token);
+        String oAuth_token = createToken(appId);
+        payloadData.add(TOKEN_PAYLOD_PARAM_NAME, oAuth_token);
 
         String textPayload = payloadData.toString();
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/2d9dceb5/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 6768fa9..e842a6e 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
@@ -141,8 +141,8 @@ public class ApplicationBuilder {
         }
 
         ApplicationStatus status = ApplicationStatus.Active;
-        ApplicationInstance context = application.getInstanceContexts(instanceId);
-        if (context.isStateTransitionValid(status)) {
+        ApplicationInstance applicationInstance = application.getInstanceContexts(instanceId);
+        if (applicationInstance.isStateTransitionValid(status)) {
             //setting the status, persist and publish
             application.setStatus(status, instanceId);
             updateApplicationMonitor(appId, status, instanceId);
@@ -151,7 +151,7 @@ public class ApplicationBuilder {
         } else {
             log.warn(String.format("Application state transition is not valid: [application-id] %s " +
                             " [instance-id] %s [current-status] %s [status-requested] %s",
-                    appId, instanceId, context.getStatus(), status));
+                    appId, instanceId, applicationInstance.getStatus(), status));
         }
     }
 
@@ -171,8 +171,8 @@ public class ApplicationBuilder {
         }
 
         ApplicationStatus status = ApplicationStatus.Inactive;
-        ApplicationInstance context = application.getInstanceContexts(instanceId);
-        if (context.isStateTransitionValid(status)) {
+        ApplicationInstance applicationInstance = application.getInstanceContexts(instanceId);
+        if (applicationInstance.isStateTransitionValid(status)) {
             //setting the status, persist and publish
             application.setStatus(status, instanceId);
             updateApplicationMonitor(appId, status, instanceId);
@@ -181,7 +181,7 @@ public class ApplicationBuilder {
         } else {
             log.warn(String.format("Application state transition is not valid: [application-id] %s " +
                             " [instance-id] %s [current-status] %s [status-requested] %s",
-                    appId, instanceId, context.getStatus(), status));
+                    appId, instanceId, applicationInstance.getStatus(), status));
         }
     }
 
@@ -241,15 +241,16 @@ public class ApplicationBuilder {
             log.warn("Application does not exist: [application-id] " + appId);
         } else {
             Application application = applications.getApplication(appId);
-            ApplicationInstance instance = application.getInstanceContexts(instanceId);
+            ApplicationInstance applicationInstance = application.getInstanceContexts(instanceId);
             ApplicationStatus status = ApplicationStatus.Terminated;
-            if (instance.isStateTransitionValid(status)) {
+            if (applicationInstance.isStateTransitionValid(status)) {
                 //setting the status, persist and publish
-                instance.setStatus(status);
+                applicationInstance.setStatus(status);
                 updateApplicationMonitor(appId, status, instanceId);
                 ApplicationMonitor applicationMonitor = AutoscalerContext.getInstance().
                         getAppMonitor(appId);
-                applicationMonitor.getNetworkPartitionContext(instance.getNetworkPartitionId()).
+                applicationMonitor.getNetworkPartitionContext(applicationInstance.
+                                                                getNetworkPartitionId()).
                         removeClusterApplicationContext(instanceId);
                 applicationMonitor.removeInstance(instanceId);
                 application.removeInstance(instanceId);
@@ -313,12 +314,14 @@ public class ApplicationBuilder {
             return;
         }
 
-        GroupInstance context = group.getInstanceContexts(instanceId);
+        GroupInstance groupInstance = group.getInstanceContexts(instanceId);
         GroupStatus status = GroupStatus.Terminated;
-        if (context != null) {
-            if (context.isStateTransitionValid(status)) {
+        String parentId;
+        if (groupInstance != null) {
+            if (groupInstance.isStateTransitionValid(status)) {
                 //setting the status, persist and publish
-                context.setStatus(status);
+                groupInstance.setStatus(status);
+                parentId = groupInstance.getParentId();
                 //removing the group instance and context
                 GroupMonitor monitor = getGroupMonitor(appId, groupId);
                 ApplicationMonitor applicationMonitor = AutoscalerContext.getInstance().
@@ -332,21 +335,21 @@ public class ApplicationBuilder {
                         }
                     }
                     GroupLevelNetworkPartitionContext networkPartitionContext =
-                            monitor.getNetworkPartitionContext(context.getNetworkPartitionId());
+                            monitor.getNetworkPartitionContext(groupInstance.getNetworkPartitionId());
                     networkPartitionContext.removeClusterGroupContext(instanceId);
-                    if (context.getPartitionId() != null) {
-                        networkPartitionContext.getPartitionCtxt(context.getPartitionId()).
-                                removeActiveInstance(context);
+                    if (groupInstance.getPartitionId() != null) {
+                        networkPartitionContext.getPartitionCtxt(groupInstance.getPartitionId()).
+                                removeActiveInstance(groupInstance);
                     }
                     monitor.removeInstance(instanceId);
                     group.removeInstance(instanceId);
                     ApplicationHolder.persistApplication(application);
                     ApplicationsEventPublisher.sendGroupInstanceTerminatedEvent(appId, groupId, instanceId);
-                    monitor.setStatus(status, instanceId);
+                    monitor.setStatus(status, instanceId, parentId);
                 }
             } else {
                 log.warn("Group state transition is not valid: [group-id] " + groupId +
-                        " [instance-id] " + instanceId + " [current-state] " + context.getStatus()
+                        " [instance-id] " + instanceId + " [current-state] " + groupInstance.getStatus()
                         + "[requested-state] " + status);
             }
 
@@ -379,18 +382,18 @@ public class ApplicationBuilder {
             return;
         }
 
-        GroupInstance context = group.getInstanceContexts(instanceId);
+        GroupInstance groupInstance = group.getInstanceContexts(instanceId);
         GroupStatus status = GroupStatus.Active;
-        if (context != null) {
-            if (context.isStateTransitionValid(status)) {
+        if (groupInstance != null) {
+            if (groupInstance.isStateTransitionValid(status)) {
                 //setting the status, persist and publish
-                context.setStatus(status);
-                updateGroupMonitor(appId, groupId, status, instanceId);
+                groupInstance.setStatus(status);
+                updateGroupMonitor(appId, groupId, status, instanceId, groupInstance.getParentId());
                 ApplicationHolder.persistApplication(application);
                 ApplicationsEventPublisher.sendGroupInstanceActivatedEvent(appId, groupId, instanceId);
             } else {
                 log.warn("Group state transition is not valid: [group-id] " + groupId +
-                        " [instance-id] " + instanceId + " [current-state] " + context.getStatus()
+                        " [instance-id] " + instanceId + " [current-state] " + groupInstance.getStatus()
                         + "[requested-state] " + status);
             }
 
@@ -404,7 +407,7 @@ public class ApplicationBuilder {
                                                                 String parentId,
                                                                 String networkPartitionId,
                                                                 String partitionId) {
-        GroupInstance instance = null;
+        GroupInstance groupInstance = null;
         ApplicationHolder.acquireWriteLock();
         try {
             if (log.isDebugEnabled()) {
@@ -417,14 +420,14 @@ public class ApplicationBuilder {
             if (application == null) {
                 log.warn(String.format("Application %s does not exist",
                         appId));
-                return instance;
+                return groupInstance;
             }
 
             Group group = application.getGroupRecursively(groupId);
             if (group == null) {
                 log.warn(String.format("Group %s does not exist when creating group",
                         groupId));
-                return instance;
+                return groupInstance;
             }
 
             GroupStatus status = GroupStatus.Created;
@@ -441,15 +444,15 @@ public class ApplicationBuilder {
 
             if (!group.containsInstanceContext(instanceId)) {
                 //setting the status, persist and publish
-                instance = new GroupInstance(groupId, instanceId);
-                instance.setParentId(parentId);
-                instance.setPartitionId(partitionId);
-                instance.setNetworkPartitionId(networkPartitionId);
-                instance.setStatus(status);
-                group.addInstance(instanceId, instance);
+                groupInstance = new GroupInstance(groupId, instanceId);
+                groupInstance.setParentId(parentId);
+                groupInstance.setPartitionId(partitionId);
+                groupInstance.setNetworkPartitionId(networkPartitionId);
+                groupInstance.setStatus(status);
+                group.addInstance(instanceId, groupInstance);
                 //updateGroupMonitor(appId, groupId, status);
                 ApplicationHolder.persistApplication(application);
-                ApplicationsEventPublisher.sendGroupInstanceCreatedEvent(appId, groupId, instance);
+                ApplicationsEventPublisher.sendGroupInstanceCreatedEvent(appId, groupId, groupInstance);
             } else {
                 log.warn("Group Instance Context already exists: [group-id] " + groupId +
                         " [Group-Instance-Id] " + instanceId);
@@ -459,7 +462,7 @@ public class ApplicationBuilder {
         }
 
 
-        return instance;
+        return groupInstance;
     }
 
 
@@ -485,18 +488,18 @@ public class ApplicationBuilder {
             return;
         }
 
-        GroupInstance context = group.getInstanceContexts(instanceId);
+        GroupInstance groupInstance = group.getInstanceContexts(instanceId);
         GroupStatus status = GroupStatus.Inactive;
-        if (context != null) {
-            if (context.isStateTransitionValid(status)) {
+        if (groupInstance != null) {
+            if (groupInstance.isStateTransitionValid(status)) {
                 //setting the status, persist and publish
-                context.setStatus(status);
-                updateGroupMonitor(appId, groupId, status, instanceId);
+                groupInstance.setStatus(status);
+                updateGroupMonitor(appId, groupId, status, instanceId, groupInstance.getParentId());
                 ApplicationHolder.persistApplication(application);
                 ApplicationsEventPublisher.sendGroupInstanceInactivateEvent(appId, groupId, instanceId);
             } else {
                 log.warn("Group state transition is not valid: [group-id] " + groupId +
-                        " [instance-id] " + instanceId + " [current-state] " + context.getStatus()
+                        " [instance-id] " + instanceId + " [current-state] " + groupInstance.getStatus()
                         + "[requested-state] " + status);
             }
 
@@ -530,18 +533,18 @@ public class ApplicationBuilder {
 
         try {
             ApplicationHolder.acquireWriteLock();
-            GroupInstance context = group.getInstanceContexts(instanceId);
+            GroupInstance groupInstance = group.getInstanceContexts(instanceId);
             GroupStatus status = GroupStatus.Terminating;
-            if (context != null) {
-                if (context.isStateTransitionValid(status)) {
+            if (groupInstance != null) {
+                if (groupInstance.isStateTransitionValid(status)) {
                     //setting the status, persist and publish
-                    context.setStatus(status);
-                    updateGroupMonitor(appId, groupId, status, instanceId);
+                    groupInstance.setStatus(status);
+                    updateGroupMonitor(appId, groupId, status, instanceId, groupInstance.getParentId());
                     ApplicationHolder.persistApplication(application);
                     ApplicationsEventPublisher.sendGroupInstanceTerminatingEvent(appId, groupId, instanceId);
                 } else {
                     log.warn("Group state transition is not valid: [group-id] " + groupId +
-                            " [instance-id] " + instanceId + " [current-state] " + context.getStatus()
+                            " [instance-id] " + instanceId + " [current-state] " + groupInstance.getStatus()
                             + "[requested-state] " + status);
                 }
 
@@ -568,10 +571,11 @@ public class ApplicationBuilder {
 
     }
 
-    private static void updateGroupMonitor(String appId, String groupId, GroupStatus status, String instanceId) {
+    private static void updateGroupMonitor(String appId, String groupId,
+                                           GroupStatus status, String instanceId, String parentInstanceId) {
         GroupMonitor monitor = getGroupMonitor(appId, groupId);
         if (monitor != null) {
-            monitor.setStatus(status, instanceId);
+            monitor.setStatus(status, instanceId, parentInstanceId);
         } else {
             log.warn("Group monitor cannot be found: [group-id] " + groupId +
                     " [application-id] " + appId);

http://git-wip-us.apache.org/repos/asf/stratos/blob/2d9dceb5/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 7d8f2b4..3ee14d2 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
@@ -369,8 +369,8 @@ public class VMClusterMonitor extends AbstractClusterMonitor {
         if (statusEvent.getStatus() == GroupStatus.Terminating || statusEvent.getStatus() ==
                 ApplicationStatus.Terminating) {
             if (log.isInfoEnabled()) {
-                log.info("Publishing Cluster terminating event for [application]: " + appId +
-                        " [cluster]: " + this.getClusterId());
+                log.info("Publishing Cluster terminating event for [application] " + appId +
+                        " [cluster] " + this.getClusterId() + " [instance] " + instanceId);
             }
             ClusterStatusEventPublisher.sendClusterTerminatingEvent(getAppId(), getServiceId(), getClusterId(), instanceId);
         }

http://git-wip-us.apache.org/repos/asf/stratos/blob/2d9dceb5/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 0052f647..6c487a7 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
@@ -140,7 +140,7 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
      *
      * @param status status of the group
      */
-    public void setStatus(GroupStatus status, String instanceId) {
+    public void setStatus(GroupStatus status, String instanceId, String parentInstanceId) {
         GroupInstance groupInstance = (GroupInstance) this.instanceIdToInstanceMap.get(instanceId);
         if (groupInstance == null) {
             if (status != GroupStatus.Terminated) {
@@ -151,8 +151,7 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
                 groupInstance.setStatus(status);
             }
         }
-        // notify parent
-        log.info("[Group] " + this.id + "is notifying the [parent] " + this.parent.getId());
+
         if (this.isGroupScalingEnabled()) {
             try {
                 ApplicationHolder.acquireReadLock();
@@ -164,14 +163,20 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
                     Group group = application.getGroupRecursively(this.id);
                     if (group != null) {
                         GroupInstance context = group.getInstanceContexts(instanceId);
+                        // notify parent
+                        log.info("[Group] " + this.id + "is notifying the [parent] " + this.parent.getId() +
+                                " [instance] " +  context.getParentId());
                         MonitorStatusEventBuilder.handleGroupStatusEvent(this.parent,
-                                status, this.id, context.getParentId());
+                                status, this.id, parentInstanceId);
                     }
                 }
             } finally {
                 ApplicationHolder.releaseReadLock();
             }
         } else {
+            // notify parent
+            log.info("[Group] " + this.id + "is notifying the [parent] " + this.parent.getId() +
+                    " [instance] " + instanceId);
             MonitorStatusEventBuilder.handleGroupStatusEvent(this.parent,
                     status, this.id, instanceId);
         }
@@ -265,12 +270,21 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
             //Get all the instances which related to this instanceId
             GroupInstance instance = (GroupInstance) this.instanceIdToInstanceMap.get(instanceId);
             if (instance != null) {
+                if (log.isInfoEnabled()) {
+                    log.info("Publishing Cluster terminating event for [application] " + appId +
+                            " [group] " + id + " [instance] " + instanceId);
+                }
                 ApplicationBuilder.handleGroupTerminatingEvent(appId, id, instanceId);
             } else {
-                //Using parentId need to get the children
+                //Using parentId need to get the all the children and ask them to terminate
+                // as they can't exist without the parent
                 List<String> instanceIds = this.getInstancesByParentInstanceId(instanceId);
                 if (!instanceIds.isEmpty()) {
                     for (String instanceId1 : instanceIds) {
+                        if (log.isInfoEnabled()) {
+                            log.info("Publishing Cluster terminating event for [application] " + appId +
+                                    " [group] " + id + " [instance] " + instanceId1);
+                        }
                         ApplicationBuilder.handleGroupTerminatingEvent(appId, id, instanceId1);
                     }
                 }
@@ -278,8 +292,6 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
             }
         } 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
             createInstanceOnDemand(statusEvent.getInstanceId());
         }

http://git-wip-us.apache.org/repos/asf/stratos/blob/2d9dceb5/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusProcessor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusProcessor.java
index 057b57c..a22c265 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusProcessor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusProcessor.java
@@ -115,8 +115,8 @@ public abstract class GroupStatusProcessor extends StatusProcessor {
                 Cluster cluster = service.getCluster(clusterId);
                 ClusterInstance context = cluster.getInstanceContexts(instanceId);
                 if (context != null) {
-                    if(log.isInfoEnabled()) {
-                        log.info("Checking the status of cluster " + clusterId + " instance status is: " +
+                    if(log.isDebugEnabled()) {
+                        log.debug("Checking the status of cluster " + clusterId + " instance status is: " +
                                 context.getStatus().toString());
                     }
                     if(context.getStatus() == status) {

http://git-wip-us.apache.org/repos/asf/stratos/blob/2d9dceb5/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusProcessorChain.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusProcessorChain.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusProcessorChain.java
index d522738..f43d2bd 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusProcessorChain.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusProcessorChain.java
@@ -57,11 +57,10 @@ public class GroupStatusProcessorChain extends StatusProcessorChain {
         if (root == null) {
             throw new RuntimeException("Message processor chain is not initialized");
         }
-        if (log.isInfoEnabled()) {
-            log.info("GroupProcessor chain calculating the status for the group " +
+        if (log.isDebugEnabled()) {
+            log.debug("GroupProcessor chain calculating the status for the group " +
                     "[ " + idOfComponent + " ]");
         }
-
         root.process(idOfComponent, appId, instanceId);
     }
 }


[3/6] stratos git commit: Make the Group monitor as a schedular executor service

Posted by re...@apache.org.
Make the Group monitor as a schedular executor service


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

Branch: refs/heads/4.1.0-test
Commit: dad6aa51a8bbfde93d7fcd1aad73f030cfcf5369
Parents: ffc8e25
Author: gayan <ga...@puppet.gayan.org>
Authored: Tue Dec 16 13:24:36 2014 +0530
Committer: reka <rt...@gmail.com>
Committed: Tue Dec 16 17:27:20 2014 +0530

----------------------------------------------------------------------
 .../monitor/component/GroupMonitor.java         | 93 ++++++++++----------
 1 file changed, 47 insertions(+), 46 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/dad6aa51/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 43a385b..0052f647 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
@@ -90,6 +90,7 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
         this.appId = appId;
         networkPartitionCtxts = new HashMap<String, GroupLevelNetworkPartitionContext>();
         this.hasScalingDependents = hasScalingDependents;
+	    mapScalingEvent=new HashMap<String, ScalingEvent>();
 	}
 
     @Override
@@ -284,52 +285,52 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
         }
     }
 
-    @Override
-    public void onChildScalingEvent(ScalingEvent scalingEvent) {
-        if (hasScalingDependents) {
-            //notify parent
-            parent.onChildScalingEvent(scalingEvent);
-        }
-
-        if (log.isDebugEnabled()) {
-            log.debug("Child scaling event received to [group]: " + this.getId()
-                    + ", [network partition]: " + scalingEvent.getNetworkPartitionId()
-                    + ", [event] " + scalingEvent.getId() + ", [group instance] " + scalingEvent.getInstanceId());
-        }
-
-        //find the child context of this group,        
-        //Notifying children, if this group has scaling dependencies
-        if (scalingDependencies != null && !scalingDependencies.isEmpty()) {
-            // has dependencies. Notify children
-            if (aliasToActiveMonitorsMap != null && !aliasToActiveMonitorsMap.values().isEmpty()) {
-
-                for (ScalingDependentList scalingDependentList : scalingDependencies) {
-
-                    for (String scalingDependentListComponent : scalingDependentList.
-                                                            getScalingDependentListComponents()) {
-
-                        if (scalingDependentListComponent.equals(scalingEvent.getId())) {
-
-                            for (String scalingDependentListComponentInSelectedList :
-                                        scalingDependentList.getScalingDependentListComponents()) {
-
-                                Monitor monitor = aliasToActiveMonitorsMap.
-                                                    get(scalingDependentListComponentInSelectedList);
-                                if (monitor instanceof GroupMonitor ||
-                                                            monitor instanceof VMClusterMonitor) {
-                                    monitor.onParentScalingEvent(scalingEvent);
-                                }
-                            }
-                            break;
-                        }
-                    }
-                }
-            }
-        }
-	    if (scalingEvent.getId().equals(appId)) {
-		    mapScalingEvent.put(scalingEvent.getInstanceId(), scalingEvent);
-	    }
-    }
+	@Override
+	public void onChildScalingEvent(ScalingEvent scalingEvent) {
+		if (hasScalingDependents) {
+			//notify parent
+			parent.onChildScalingEvent(scalingEvent);
+		}
+
+		if (log.isDebugEnabled()) {
+			log.debug("Child scaling event received to [group]: " + this.getId()
+			          + ", [network partition]: " + scalingEvent.getNetworkPartitionId()
+			          + ", [event] " + scalingEvent.getId() + ", [group instance] " + scalingEvent.getInstanceId());
+		}
+
+		//find the child context of this group,
+		//Notifying children, if this group has scaling dependencies
+		if (scalingDependencies != null && !scalingDependencies.isEmpty()) {
+			// has dependencies. Notify children
+			if (aliasToActiveMonitorsMap != null && !aliasToActiveMonitorsMap.values().isEmpty()) {
+
+				for (ScalingDependentList scalingDependentList : scalingDependencies) {
+
+					for (String scalingDependentListComponent : scalingDependentList
+							.getScalingDependentListComponents()) {
+
+						if (scalingDependentListComponent.equals(scalingEvent.getId())) {
+
+							for (String scalingDependentListComponentInSelectedList :
+									scalingDependentList.getScalingDependentListComponents()) {
+
+								Monitor monitor = aliasToActiveMonitorsMap.get(
+										scalingDependentListComponentInSelectedList);
+								if (monitor instanceof GroupMonitor ||
+								    monitor instanceof VMClusterMonitor) {
+									monitor.onParentScalingEvent(scalingEvent);
+								}
+							}
+							break;
+						}
+					}
+				}
+			}
+		}
+		if (scalingEvent.getId().equals(appId)) {
+			mapScalingEvent.put(scalingEvent.getInstanceId(), scalingEvent);
+		}
+	}
 
     @Override
     public void onChildScalingOverMaxEvent(ScalingOverMaxEvent scalingOverMaxEvent) {


[5/6] stratos git commit: adding support for group scaling

Posted by re...@apache.org.
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/8e8ca216
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/8e8ca216
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/8e8ca216

Branch: refs/heads/4.1.0-test
Commit: 8e8ca216fb7734a89b031da6819f280450209ea1
Parents: 192ad24
Author: reka <rt...@gmail.com>
Authored: Tue Dec 16 17:24:14 2014 +0530
Committer: reka <rt...@gmail.com>
Committed: Tue Dec 16 17:27:21 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/8e8ca216/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/8e8ca216/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/8e8ca216/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/8e8ca216/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/8e8ca216/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/8e8ca216/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/8e8ca216/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/8e8ca216/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/8e8ca216/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/8e8ca216/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/8e8ca216/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/8e8ca216/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/8e8ca216/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);
     }
 


[4/6] stratos git commit: handling child scaling event and max out event in group monitor

Posted by re...@apache.org.
handling child scaling event and max out event in group monitor


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

Branch: refs/heads/4.1.0-test
Commit: 192ad24dd96e41842d658e8e0a0679b3102f795f
Parents: 2d9dceb
Author: reka <rt...@gmail.com>
Authored: Tue Dec 16 15:31:08 2014 +0530
Committer: reka <rt...@gmail.com>
Committed: Tue Dec 16 17:27:21 2014 +0530

----------------------------------------------------------------------
 .../context/group/GroupInstanceContext.java     |  50 ++++-
 .../GroupLevelNetworkPartitionContext.java      |   5 +
 .../monitor/component/GroupMonitor.java         | 215 +++++++++++--------
 3 files changed, 177 insertions(+), 93 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/192ad24d/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 072fc04..c7cbbe6 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
@@ -20,9 +20,13 @@ package org.apache.stratos.autoscaler.context.group;
 
 import org.apache.stratos.autoscaler.context.InstanceContext;
 import org.apache.stratos.autoscaler.context.partition.GroupLevelPartitionContext;
+import org.apache.stratos.autoscaler.monitor.events.ScalingEvent;
+import org.apache.stratos.autoscaler.monitor.events.ScalingOverMaxEvent;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * This will hold the group instance related info
@@ -31,11 +35,16 @@ public class GroupInstanceContext extends InstanceContext {
 
     //partitions of this network partition
     private final List<GroupLevelPartitionContext> partitionCtxts;
+    //key=id of the child, value=ScalingEvent
+    private Map<String, ScalingEvent> idToScalingEvent;
+    //key=id of the child, value=MaxOutScalingEvent
+    private Map<String, ScalingOverMaxEvent> idToScalingOverMaxEvent;
 
     public GroupInstanceContext(String id) {
         super(id);
         partitionCtxts = new ArrayList<GroupLevelPartitionContext>();
-
+        setIdToScalingEvent(new HashMap<String, ScalingEvent>());
+        setIdToScalingOverMaxEvent(new HashMap<String, ScalingOverMaxEvent>());
     }
 
     public List<GroupLevelPartitionContext> getPartitionCtxts() {
@@ -78,4 +87,43 @@ public class GroupInstanceContext extends InstanceContext {
         return 0;
     }
 
+    public Map<String, ScalingEvent> getIdToScalingEvent() {
+        return idToScalingEvent;
+    }
+
+    public void setIdToScalingEvent(Map<String, ScalingEvent> idToScalingEvent) {
+        this.idToScalingEvent = idToScalingEvent;
+    }
+
+    public Map<String, ScalingOverMaxEvent> getIdToScalingOverMaxEvent() {
+        return idToScalingOverMaxEvent;
+    }
+
+    public void setIdToScalingOverMaxEvent(Map<String, ScalingOverMaxEvent> idToScalingOverMaxEvent) {
+        this.idToScalingOverMaxEvent = idToScalingOverMaxEvent;
+    }
+
+    public void removeScalingEvent(String id) {
+        this.idToScalingEvent.remove(id);
+    }
+
+    public void addScalingEvent(ScalingEvent scalingEvent) {
+        this.idToScalingEvent.put(scalingEvent.getId(), scalingEvent);
+    }
+
+    public void removeScalingOverMaxEvent(String id) {
+        this.idToScalingOverMaxEvent.remove(id);
+    }
+
+    public void addScalingOverMaxEvent(ScalingOverMaxEvent scalingOverMaxEvent) {
+        this.idToScalingOverMaxEvent.put(scalingOverMaxEvent.getId(), scalingOverMaxEvent);
+    }
+
+    public boolean containsScalingEvent(String id) {
+        return this.idToScalingEvent.containsKey(id);
+    }
+
+    public boolean containsScalingOverMaxEvent(String id) {
+        return this.idToScalingOverMaxEvent.containsKey(id);
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/192ad24d/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 d461258..52af38d 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
@@ -20,6 +20,7 @@ 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.InstanceContext;
 import org.apache.stratos.autoscaler.context.group.GroupInstanceContext;
 import org.apache.stratos.autoscaler.context.partition.GroupLevelPartitionContext;
 
@@ -85,6 +86,10 @@ public class GroupLevelNetworkPartitionContext extends NetworkPartitionContext i
 
     }
 
+    public GroupInstanceContext getInstanceContext(String instanceId) {
+        return this.instanceIdToInstanceContextMap.get(instanceId);
+    }
+
     public int getMinInstanceCount() {
         return minInstanceCount;
     }

http://git-wip-us.apache.org/repos/asf/stratos/blob/192ad24d/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 6c487a7..500a0ff 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,7 +48,10 @@ 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.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
@@ -60,22 +63,18 @@ import java.util.concurrent.TimeUnit;
 public class GroupMonitor extends ParentComponentMonitor implements Runnable {
 
     private static final Log log = LogFactory.getLog(GroupMonitor.class);
+    private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
     //has scaling dependents
     protected boolean hasScalingDependents;
     //Indicates whether groupScaling enabled or not
     private boolean groupScalingEnabled;
     //Network partition contexts
     private Map<String, GroupLevelNetworkPartitionContext> networkPartitionCtxts;
-
-	private Map<String, ScalingEvent> mapScalingEvent;
-
     //Indicates whether the monitor is destroyed or not
     private boolean isDestroyed;
     //Monitoring interval of the monitor
     private int monitoringIntervalMilliseconds = 60000;     //TODO get this from config file
 
-	private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
-
     /**
      * Constructor of GroupMonitor
      *
@@ -90,50 +89,48 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
         this.appId = appId;
         networkPartitionCtxts = new HashMap<String, GroupLevelNetworkPartitionContext>();
         this.hasScalingDependents = hasScalingDependents;
-	    mapScalingEvent=new HashMap<String, ScalingEvent>();
-	}
+    }
 
     @Override
     public void run() {
         try {
-
-		    if (log.isDebugEnabled()) {
-			    log.debug("Group monitor is running : " + this.toString());
-		    }
-		    monitor();
-	    } catch (Exception e) {
-		    log.error("Group monitor failed : " + this.toString(), e);
-	    }
+            if (log.isDebugEnabled()) {
+                log.debug("Group monitor is running : " + this.toString());
+            }
+            monitor();
+        } catch (Exception e) {
+            log.error("Group monitor failed : " + this.toString(), e);
+        }
     }
 
-	public void startScheduler() {
-		scheduler.scheduleAtFixedRate(this, 0, monitoringIntervalMilliseconds, TimeUnit.MILLISECONDS);
-	}
+    public void startScheduler() {
+        scheduler.scheduleAtFixedRate(this, 0, monitoringIntervalMilliseconds, TimeUnit.MILLISECONDS);
+    }
 
-	protected void stopScheduler() {
-		scheduler.shutdownNow();
+    protected void stopScheduler() {
+        scheduler.shutdownNow();
     }
 
-	public void monitor() {
-
-		Runnable monitoringRunnable = new Runnable() {
-			@Override
-			public void run() {
-				float finalFactor = 1;
-				if (log.isInfoEnabled()) {
-					log.info("Group monitor is running====== : " + this.toString());
-				}
-
-				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();
-	}
+    public void monitor() {
+
+        Runnable monitoringRunnable = new Runnable() {
+            @Override
+            public void run() {
+                float finalFactor = 1;
+                if (log.isDebugEnabled()) {
+                    log.debug("Group monitor is running====== : " + this.toString());
+                }
+
+				/*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();
+    }
 
     /**
      * Will set the status of the monitor based on Topology Group status/child status like scaling
@@ -165,7 +162,7 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
                         GroupInstance context = group.getInstanceContexts(instanceId);
                         // notify parent
                         log.info("[Group] " + this.id + "is notifying the [parent] " + this.parent.getId() +
-                                " [instance] " +  context.getParentId());
+                                " [instance] " + context.getParentId());
                         MonitorStatusEventBuilder.handleGroupStatusEvent(this.parent,
                                 status, this.id, parentInstanceId);
                     }
@@ -297,56 +294,90 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
         }
     }
 
-	@Override
-	public void onChildScalingEvent(ScalingEvent scalingEvent) {
-		if (hasScalingDependents) {
-			//notify parent
-			parent.onChildScalingEvent(scalingEvent);
-		}
-
-		if (log.isDebugEnabled()) {
-			log.debug("Child scaling event received to [group]: " + this.getId()
-			          + ", [network partition]: " + scalingEvent.getNetworkPartitionId()
-			          + ", [event] " + scalingEvent.getId() + ", [group instance] " + scalingEvent.getInstanceId());
-		}
-
-		//find the child context of this group,
-		//Notifying children, if this group has scaling dependencies
-		if (scalingDependencies != null && !scalingDependencies.isEmpty()) {
-			// has dependencies. Notify children
-			if (aliasToActiveMonitorsMap != null && !aliasToActiveMonitorsMap.values().isEmpty()) {
-
-				for (ScalingDependentList scalingDependentList : scalingDependencies) {
-
-					for (String scalingDependentListComponent : scalingDependentList
-							.getScalingDependentListComponents()) {
-
-						if (scalingDependentListComponent.equals(scalingEvent.getId())) {
-
-							for (String scalingDependentListComponentInSelectedList :
-									scalingDependentList.getScalingDependentListComponents()) {
-
-								Monitor monitor = aliasToActiveMonitorsMap.get(
-										scalingDependentListComponentInSelectedList);
-								if (monitor instanceof GroupMonitor ||
-								    monitor instanceof VMClusterMonitor) {
-									monitor.onParentScalingEvent(scalingEvent);
-								}
-							}
-							break;
-						}
-					}
-				}
-			}
-		}
-		if (scalingEvent.getId().equals(appId)) {
-			mapScalingEvent.put(scalingEvent.getInstanceId(), scalingEvent);
-		}
-	}
+    @Override
+    public void onChildScalingEvent(ScalingEvent scalingEvent) {
+        if (hasScalingDependents) {
+            //notify parent
+            parent.onChildScalingEvent(scalingEvent);
+        }
+
+        if (log.isDebugEnabled()) {
+            log.debug("Child scaling event received to [group]: " + this.getId()
+                    + ", [network partition]: " + scalingEvent.getNetworkPartitionId()
+                    + ", [event] " + scalingEvent.getId() + ", [group instance] " + scalingEvent.getInstanceId());
+        }
+
+        //find the child context of this group,
+        //Notifying children, if this group has scaling dependencies
+        if (scalingDependencies != null && !scalingDependencies.isEmpty()) {
+            // has dependencies. Notify children
+            if (aliasToActiveMonitorsMap != null && !aliasToActiveMonitorsMap.values().isEmpty()) {
+
+                for (ScalingDependentList scalingDependentList : scalingDependencies) {
+
+                    for (String scalingDependentListComponent : scalingDependentList
+                            .getScalingDependentListComponents()) {
+
+                        if (scalingDependentListComponent.equals(scalingEvent.getId())) {
+
+                            for (String scalingDependentListComponentInSelectedList :
+                                    scalingDependentList.getScalingDependentListComponents()) {
+
+                                Monitor monitor = aliasToActiveMonitorsMap.get(
+                                        scalingDependentListComponentInSelectedList);
+                                if (monitor instanceof GroupMonitor ||
+                                        monitor instanceof VMClusterMonitor) {
+                                    monitor.onParentScalingEvent(scalingEvent);
+                                }
+                            }
+                            break;
+                        }
+                    }
+                }
+            }
+        }
+
+        String networkPartitionId = scalingEvent.getNetworkPartitionId();
+        String instanceId = scalingEvent.getInstanceId();
+        String id = scalingEvent.getId();
+        GroupLevelNetworkPartitionContext networkPartitionContext =
+                this.networkPartitionCtxts.get(networkPartitionId);
+        if (networkPartitionContext != null) {
+            GroupInstanceContext instanceContext = networkPartitionContext.getInstanceContext(instanceId);
+            if (instanceContext != null) {
+                if (instanceContext.containsScalingEvent(id)) {
+                    instanceContext.removeScalingEvent(id);
+                    instanceContext.addScalingEvent(scalingEvent);
+                } else {
+                    instanceContext.addScalingEvent(scalingEvent);
+                }
+            }
+        }
+    }
 
     @Override
     public void onChildScalingOverMaxEvent(ScalingOverMaxEvent scalingOverMaxEvent) {
-
+        //Checking whether this monitor has room to create new instances else
+        // notify the parent with max out
+        //TODO by drool or periodic monitor or here
+
+        //adding the scaling over max event to group instance Context
+        String networkPartitionId = scalingOverMaxEvent.getNetworkPartitionId();
+        String instanceId = scalingOverMaxEvent.getInstanceId();
+        String id = scalingOverMaxEvent.getId();
+        GroupLevelNetworkPartitionContext networkPartitionContext =
+                this.networkPartitionCtxts.get(networkPartitionId);
+        if (networkPartitionContext != null) {
+            GroupInstanceContext instanceContext = networkPartitionContext.getInstanceContext(instanceId);
+            if (instanceContext != null) {
+                if (instanceContext.containsScalingEvent(id)) {
+                    instanceContext.removeScalingOverMaxEvent(id);
+                    instanceContext.addScalingOverMaxEvent(scalingOverMaxEvent);
+                } else {
+                    instanceContext.addScalingOverMaxEvent(scalingOverMaxEvent);
+                }
+            }
+        }
     }
 
     @Override
@@ -755,9 +786,9 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
                 int minInstances = this.networkPartitionCtxts.get(networkPartitionId).
                         getMinInstanceCount();
                 //if terminated all the instances in this instances map should be in terminated state
-                if(noOfInstancesOfRequiredStatus == this.inactiveInstancesMap.size() &&
+                if (noOfInstancesOfRequiredStatus == this.inactiveInstancesMap.size() &&
                         requiredStatus == GroupStatus.Terminated) {
-                   return true;
+                    return true;
                 } else if (noOfInstancesOfRequiredStatus >= minInstances) {
                     return true;
                 } else {
@@ -774,7 +805,7 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
 
     @Override
     public void destroy() {
-        //TODO to stop all the drools
+        stopScheduler();
     }
 
 }


[6/6] stratos git commit: merging to add List support for scaling dependents

Posted by re...@apache.org.
merging to add List support for scaling dependents


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

Branch: refs/heads/4.1.0-test
Commit: 66bc3acf3c3641a1c713c7d6001c657eac6cb79e
Parents: 8e8ca21
Author: reka <rt...@gmail.com>
Authored: Tue Dec 16 17:27:08 2014 +0530
Committer: reka <rt...@gmail.com>
Committed: Tue Dec 16 17:27:21 2014 +0530

----------------------------------------------------------------------
 .../messaging/domain/applications/ScalingDependentList.java      | 4 ++++
 1 file changed, 4 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/66bc3acf/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/ScalingDependentList.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/ScalingDependentList.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/ScalingDependentList.java
index 954cb0b..14f1d61 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/ScalingDependentList.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/ScalingDependentList.java
@@ -34,6 +34,10 @@ public class ScalingDependentList implements Serializable {
         return scalingDependentListComponents;
     }
 
+    public boolean isScalingDependent(String id) {
+        return scalingDependentListComponents.contains(id);
+    }
+
     public void setScalingDependentListComponents(List<String> scalingDependentListComponents) {
         this.scalingDependentListComponents = scalingDependentListComponents;
     }


[2/6] stratos git commit: Make the Group monitor as a schedular executor service

Posted by re...@apache.org.
Make the Group monitor as a schedular executor service


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

Branch: refs/heads/4.1.0-test
Commit: ffc8e25669c5f302c8e872f0ff331d56d7a2c2e6
Parents: cbc02ad
Author: gayan <ga...@puppet.gayan.org>
Authored: Tue Dec 16 13:08:43 2014 +0530
Committer: reka <rt...@gmail.com>
Committed: Tue Dec 16 17:27:20 2014 +0530

----------------------------------------------------------------------
 .../autoscaler/monitor/MonitorFactory.java      |  1 +
 .../monitor/component/GroupMonitor.java         | 74 +++++++++++++-------
 2 files changed, 48 insertions(+), 27 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/ffc8e256/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 3291ea9..12e0794 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
@@ -125,6 +125,7 @@ public class MonitorFactory {
                 } else {
                     groupMonitor.setHasStartupDependents(false);
                 }
+	            groupMonitor.startScheduler();
             }
         } finally {
             ApplicationHolder.releaseReadLock();

http://git-wip-us.apache.org/repos/asf/stratos/blob/ffc8e256/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 f69a05a..43a385b 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,10 @@ 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;
 
 /**
  * This is GroupMonitor to monitor the group which consists of
@@ -66,11 +66,16 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
     private boolean groupScalingEnabled;
     //Network partition contexts
     private Map<String, GroupLevelNetworkPartitionContext> networkPartitionCtxts;
+
+	private Map<String, ScalingEvent> mapScalingEvent;
+
     //Indicates whether the monitor is destroyed or not
     private boolean isDestroyed;
     //Monitoring interval of the monitor
     private int monitoringIntervalMilliseconds = 60000;     //TODO get this from config file
 
+	private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
+
     /**
      * Constructor of GroupMonitor
      *
@@ -85,38 +90,50 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
         this.appId = appId;
         networkPartitionCtxts = new HashMap<String, GroupLevelNetworkPartitionContext>();
         this.hasScalingDependents = hasScalingDependents;
-    }
+	}
 
     @Override
     public void run() {
-        while (!isDestroyed) {
-            try {
+        try {
 
-                if (log.isDebugEnabled()) {
-                    log.debug("Group monitor is running : " + this.toString());
-                }
-                monitor();
-            } catch (Exception e) {
-                log.error("Group monitor failed : " + this.toString(), e);
-            }
-            try {
-                Thread.sleep(monitoringIntervalMilliseconds);
-            } catch (InterruptedException ignore) {
-            }
-        }
+		    if (log.isDebugEnabled()) {
+			    log.debug("Group monitor is running : " + this.toString());
+		    }
+		    monitor();
+	    } catch (Exception e) {
+		    log.error("Group monitor failed : " + this.toString(), e);
+	    }
     }
 
-    public void monitor() {
+	public void startScheduler() {
+		scheduler.scheduleAtFixedRate(this, 0, monitoringIntervalMilliseconds, TimeUnit.MILLISECONDS);
+	}
 
-        Runnable monitoringRunnable = new Runnable() {
-            @Override
-            public void run() {
-                //TODO implement group monitor
-            }
-        };
-        monitoringRunnable.run();
+	protected void stopScheduler() {
+		scheduler.shutdownNow();
     }
 
+	public void monitor() {
+
+		Runnable monitoringRunnable = new Runnable() {
+			@Override
+			public void run() {
+				float finalFactor = 1;
+				if (log.isInfoEnabled()) {
+					log.info("Group monitor is running====== : " + this.toString());
+				}
+
+				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();
+	}
+
     /**
      * Will set the status of the monitor based on Topology Group status/child status like scaling
      *
@@ -309,6 +326,9 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
                 }
             }
         }
+	    if (scalingEvent.getId().equals(appId)) {
+		    mapScalingEvent.put(scalingEvent.getInstanceId(), scalingEvent);
+	    }
     }
 
     @Override