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 2015/09/16 08:35:41 UTC
[1/3] stratos git commit: improving force undeployment
Repository: stratos
Updated Branches:
refs/heads/stratos-4.1.x b5d1020da -> 70eaa362d
improving force undeployment
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/45228ba3
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/45228ba3
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/45228ba3
Branch: refs/heads/stratos-4.1.x
Commit: 45228ba3739e53f9cddcbf1b8484b98192bb5ce9
Parents: 21e6c20
Author: reka <rt...@gmail.com>
Authored: Wed Sep 16 10:48:04 2015 +0530
Committer: reka <rt...@gmail.com>
Committed: Wed Sep 16 10:49:03 2015 +0530
----------------------------------------------------------------------
.../stratos/autoscaler/monitor/Monitor.java | 3 +-
.../monitor/component/ApplicationMonitor.java | 45 ++---
.../monitor/component/GroupMonitor.java | 69 +++----
.../component/ParentComponentMonitor.java | 4 +
.../services/impl/AutoscalerServiceImpl.java | 183 +++++++++++--------
.../stratos/autoscaler/util/AutoscalerUtil.java | 38 ++++
.../activemq-data/testBroker/KahaDB/db-1.log | Bin 0 -> 33030144 bytes
.../activemq-data/testBroker/KahaDB/db.data | Bin 0 -> 49152 bytes
.../activemq-data/testBroker/KahaDB/db.redo | Bin 0 -> 49240 bytes
.../application/ApplicationUpdateTest.java | 7 +-
10 files changed, 209 insertions(+), 140 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/stratos/blob/45228ba3/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 170d99f..c58ec41 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
@@ -22,6 +22,7 @@ import org.apache.stratos.autoscaler.monitor.component.ParentComponentMonitor;
import org.apache.stratos.messaging.domain.instance.Instance;
import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
/**
* Abstract class for the monitoring functionality in Autoscaler.
@@ -38,7 +39,7 @@ public abstract class Monitor implements EventHandler, Runnable {
//monitors map, key=InstanceId and value=ClusterInstance/GroupInstance/ApplicationInstance
protected Map<String, Instance> instanceIdToInstanceMap;
public Monitor() {
- this.instanceIdToInstanceMap = new HashMap<String, Instance>();
+ this.instanceIdToInstanceMap = new ConcurrentHashMap<String, Instance>();
}
/**
http://git-wip-us.apache.org/repos/asf/stratos/blob/45228ba3/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 70ee9d4..e15b795 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
@@ -445,30 +445,33 @@ public class ApplicationMonitor extends ParentComponentMonitor {
removeInstanceFromFromInactiveMap(childId, instanceId);
removeInstanceFromFromTerminatingMap(childId, instanceId);
- ApplicationInstance instance = (ApplicationInstance) instanceIdToInstanceMap.get(instanceId);
- if (instance != null) {
- if (isTerminating() || instance.getStatus() == ApplicationStatus.Terminating ||
- instance.getStatus() == ApplicationStatus.Terminated) {
- ServiceReferenceHolder.getInstance().getGroupStatusProcessorChain().process(id,
- appId, instanceId);
- } else {
- Monitor monitor = getMonitor(childId);
- boolean active = false;
- if (monitor instanceof GroupMonitor) {
- //Checking whether the Group is still active in case the faulty member
- // identified after scaling up
- active = verifyGroupStatus(childId, instanceId, GroupStatus.Active);
- }
- if (!active) {
- onChildTerminatedEvent(childId, instanceId);
+ //If application is forcefully un-deployed, no need to handle here.
+ if(!force) {
+ ApplicationInstance instance = (ApplicationInstance) instanceIdToInstanceMap.get(instanceId);
+ if (instance != null) {
+ if (isTerminating() || instance.getStatus() == ApplicationStatus.Terminating ||
+ instance.getStatus() == ApplicationStatus.Terminated) {
+ ServiceReferenceHolder.getInstance().getGroupStatusProcessorChain().process(id,
+ appId, instanceId);
} else {
- log.info("[Group Instance] " + instanceId + " is still active " +
- "upon termination of the [child ] " + childId);
+ Monitor monitor = getMonitor(childId);
+ boolean active = false;
+ if (monitor instanceof GroupMonitor) {
+ //Checking whether the Group is still active in case the faulty member
+ // identified after scaling up
+ active = verifyGroupStatus(childId, instanceId, GroupStatus.Active);
+ }
+ if (!active) {
+ onChildTerminatedEvent(childId, instanceId);
+ } else {
+ log.info("[Group Instance] " + instanceId + " is still active " +
+ "upon termination of the [child ] " + childId);
+ }
}
+ } else {
+ log.warn("The required instance cannot be found in the the [GroupMonitor] " +
+ id);
}
- } else {
- log.warn("The required instance cannot be found in the the [GroupMonitor] " +
- id);
}
}
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/45228ba3/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 bc3052a..3136ed0 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
@@ -504,43 +504,48 @@ public class GroupMonitor extends ParentComponentMonitor {
removeInstanceFromFromInactiveMap(childId, instanceId);
removeInstanceFromFromTerminatingMap(childId, instanceId);
- GroupInstance instance = (GroupInstance) instanceIdToInstanceMap.get(instanceId);
- if (instance != null) {
- // If this parent instance is terminating, then based on child notification,
- // it has to decide its state rather than starting a the children recovery
-
- ApplicationMonitor applicationMonitor = AutoscalerContext.getInstance().
- getAppMonitor(appId);
- //In case if the group instance is not in terminating while application is
- // terminating, changing the status to terminating
- if (applicationMonitor.isTerminating() && instance.getStatus().getCode() < 3) {
- //Sending group instance terminating event
- ApplicationBuilder.handleGroupTerminatingEvent(appId, id, instanceId);
- }
+ // If this parent instance is terminating, then based on child notification,
+ // it has to decide its state rather than starting a the children recovery
+
+ ApplicationMonitor applicationMonitor = AutoscalerContext.getInstance().
+ getAppMonitor(appId);
+ //If application is forcefully un-deployed, no need to handle here.
+ if(!applicationMonitor.isForce()) {
+ GroupInstance instance = (GroupInstance) instanceIdToInstanceMap.get(instanceId);
+ if (instance != null) {
+
+ //In case if the group instance is not in terminating while application is
+ // terminating, changing the status to terminating
+ if (applicationMonitor.isTerminating() && instance.getStatus().getCode() < 3) {
+ //Sending group instance terminating event
+ ApplicationBuilder.handleGroupTerminatingEvent(appId, id, instanceId);
+ }
- if (instance.getStatus() == GroupStatus.Terminating ||
- instance.getStatus() == GroupStatus.Terminated) {
- ServiceReferenceHolder.getInstance().getGroupStatusProcessorChain().process(id,
- appId, instanceId);
- } else {
- //Checking whether the child who notified is still active.
- // If it is active(scale down case), no need to act upon it.
- // Otherwise act upon Termination and see whether it is required to start
- // instance again based on termination behavior
- boolean active = verifyGroupStatus(childId, instanceId, GroupStatus.Active);
- if (!active) {
- onChildTerminatedEvent(childId, instanceId);
+ if (instance.getStatus() == GroupStatus.Terminating ||
+ instance.getStatus() == GroupStatus.Terminated) {
+ ServiceReferenceHolder.getInstance().getGroupStatusProcessorChain().process(id,
+ appId, instanceId);
} else {
- log.info("[Group Instance] " + instanceId + " for [application] " + appId +
- " is still active upon termination" +
- " of the [child] " + childId);
+ //Checking whether the child who notified is still active.
+ // If it is active(scale down case), no need to act upon it.
+ // Otherwise act upon Termination and see whether it is required to start
+ // instance again based on termination behavior
+ boolean active = verifyGroupStatus(childId, instanceId, GroupStatus.Active);
+ if (!active) {
+ onChildTerminatedEvent(childId, instanceId);
+ } else {
+ log.info("[Group Instance] " + instanceId + " for [application] " + appId +
+ " is still active upon termination" +
+ " of the [child] " + childId);
+ }
}
+ } else {
+ log.warn("The required [instance] " + instanceId + " for [application] " + appId +
+ " cannot be found in the the [GroupMonitor] " +
+ id + " upon termination of the [child] " + childId);
}
- } else {
- log.warn("The required [instance] " + instanceId + " for [application] " + appId +
- " cannot be found in the the [GroupMonitor] " +
- id + " upon termination of the [child] " + childId);
}
+
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/45228ba3/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 98e97cf..f05827a 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
@@ -1062,4 +1062,8 @@ public abstract class ParentComponentMonitor extends Monitor {
return stringBuilder.toString();
}
}
+
+ public void removeMonitor(String id) {
+ this.aliasToActiveChildMonitorsMap.remove(id);
+ }
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/45228ba3/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/services/impl/AutoscalerServiceImpl.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/services/impl/AutoscalerServiceImpl.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/services/impl/AutoscalerServiceImpl.java
index d9023f7..605367f 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/services/impl/AutoscalerServiceImpl.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/services/impl/AutoscalerServiceImpl.java
@@ -41,8 +41,10 @@ import org.apache.stratos.autoscaler.exception.application.InvalidApplicationPol
import org.apache.stratos.autoscaler.exception.application.InvalidServiceGroupException;
import org.apache.stratos.autoscaler.exception.application.UnremovableApplicationException;
import org.apache.stratos.autoscaler.exception.policy.*;
+import org.apache.stratos.autoscaler.monitor.Monitor;
import org.apache.stratos.autoscaler.monitor.cluster.ClusterMonitor;
import org.apache.stratos.autoscaler.monitor.component.ApplicationMonitor;
+import org.apache.stratos.autoscaler.monitor.component.GroupMonitor;
import org.apache.stratos.autoscaler.pojo.Dependencies;
import org.apache.stratos.autoscaler.pojo.ServiceGroup;
import org.apache.stratos.autoscaler.pojo.policy.PolicyManager;
@@ -70,6 +72,7 @@ import org.apache.stratos.manager.service.stub.domain.application.signup.Artifac
import org.apache.stratos.messaging.domain.application.Application;
import org.apache.stratos.messaging.domain.application.ClusterDataHolder;
import org.apache.stratos.messaging.domain.instance.ClusterInstance;
+import org.apache.stratos.messaging.domain.instance.Instance;
import org.apache.stratos.messaging.domain.topology.Cluster;
import org.apache.stratos.messaging.domain.topology.Member;
import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
@@ -251,8 +254,7 @@ public class AutoscalerServiceImpl implements AutoscalerService {
application = ApplicationHolder.getApplications().getApplication(applicationId);
application.setApplicationPolicyId(applicationPolicyId);
ApplicationHolder.persistApplication(application);
- }
- finally {
+ } finally {
ApplicationHolder.releaseWriteLock();
}
@@ -277,8 +279,7 @@ public class AutoscalerServiceImpl implements AutoscalerService {
applicationId);
return true;
- }
- catch (Exception e) {
+ } catch (Exception e) {
ApplicationContext applicationContext = RegistryManager.getInstance().
getApplicationContext(applicationId);
if (applicationContext != null) {
@@ -359,8 +360,7 @@ public class AutoscalerServiceImpl implements AutoscalerService {
applicationContext.getApplicationId()));
}
}
- }
- catch (Exception e) {
+ } catch (Exception e) {
String message =
"Could not add application signup: [application-id]" + applicationContext.getApplicationId();
log.error(message, e);
@@ -410,8 +410,7 @@ public class AutoscalerServiceImpl implements AutoscalerService {
}
}
- }
- catch (Exception e) {
+ } catch (Exception e) {
String message = "Could not remove application signup(s)";
log.error(message, e);
throw new RuntimeException(message, e);
@@ -481,10 +480,10 @@ public class AutoscalerServiceImpl implements AutoscalerService {
return false;
}
- boolean applicationSignUpExists =false;
+ boolean applicationSignUpExists = false;
ApplicationContext applicationContext = RegistryManager.getInstance().getApplicationContext(applicationId);
- if(applicationContext.isMultiTenant()){
+ if (applicationContext.isMultiTenant()) {
StratosManagerServiceClient serviceClient = StratosManagerServiceClient.getInstance();
ApplicationSignUp applicationSignUps[] = serviceClient.getApplicationSignUps(applicationId);
@@ -564,8 +563,7 @@ public class AutoscalerServiceImpl implements AutoscalerService {
if (log.isInfoEnabled()) {
log.info("Application undeployment process started: [application-id] " + applicationId);
}
- }
- catch (Exception e) {
+ } catch (Exception e) {
String message = "Could not start application undeployment process: [application-id] " + applicationId;
log.error(message, e);
throw new RuntimeException(message, e);
@@ -600,8 +598,7 @@ public class AutoscalerServiceImpl implements AutoscalerService {
ApplicationBuilder.handleApplicationRemoval(applicationId);
log.info(String.format("Application deleted successfully: [application-id] %s", applicationId));
- }
- catch (Exception e) {
+ } catch (Exception e) {
String message = String.format("Could not delete application: [application-id] %s", applicationId);
log.error(message, e);
throw new RuntimeException(message, e);
@@ -745,8 +742,7 @@ public class AutoscalerServiceImpl implements AutoscalerService {
try {
RegistryManager.getInstance().updateServiceGroup(cartridgeGroup);
- }
- catch (org.wso2.carbon.registry.core.exceptions.RegistryException e) {
+ } catch (org.wso2.carbon.registry.core.exceptions.RegistryException e) {
String message = (String.format("Cannot update cartridge group: [group-name] %s",
cartridgeGroup.getName()));
throw new RuntimeException(message, e);
@@ -777,8 +773,7 @@ public class AutoscalerServiceImpl implements AutoscalerService {
}
throw new CartridgeGroupNotFoundException(msg);
}
- }
- catch (org.wso2.carbon.registry.core.exceptions.RegistryException e) {
+ } catch (org.wso2.carbon.registry.core.exceptions.RegistryException e) {
String message = "Could not remove cartridge group: " + groupName;
log.error(message, e);
throw new RuntimeException(message, e);
@@ -792,8 +787,7 @@ public class AutoscalerServiceImpl implements AutoscalerService {
}
try {
return RegistryManager.getInstance().getServiceGroup(name);
- }
- catch (Exception e) {
+ } catch (Exception e) {
throw new AutoScalerException("Error occurred while retrieving cartridge group", e);
}
}
@@ -811,13 +805,11 @@ public class AutoscalerServiceImpl implements AutoscalerService {
}
}
return null;
- }
- catch (Exception e) {
+ } catch (Exception e) {
String message = String.format("Could not find cluster id: [application-id] %s [alias] %s",
applicationId, alias);
throw new AutoScalerException(message, e);
- }
- finally {
+ } finally {
ApplicationHolder.releaseReadLock();
}
}
@@ -833,8 +825,7 @@ public class AutoscalerServiceImpl implements AutoscalerService {
public boolean undeployServiceGroup(String name) throws AutoScalerException {
try {
RegistryManager.getInstance().removeServiceGroup(name);
- }
- catch (RegistryException e) {
+ } catch (RegistryException e) {
throw new AutoScalerException("Error occurred while removing the cartridge groups", e);
}
return true;
@@ -950,66 +941,102 @@ public class AutoscalerServiceImpl implements AutoscalerService {
"[application-id] %s", applicationId));
return;
}
- }
- finally {
+ } finally {
ApplicationHolder.releaseReadLock();
}
- Set<ClusterDataHolder> allClusters = application.getClusterDataRecursively();
- for (ClusterDataHolder clusterDataHolder : allClusters) {
- String serviceType = clusterDataHolder.getServiceType();
- String clusterId = clusterDataHolder.getClusterId();
+ //Stopping the application monitor thread
+ ApplicationMonitor applicationMonitor = AutoscalerContext.getInstance().
+ getAppMonitor(applicationId);
+ if (applicationMonitor != null) {
+ applicationMonitor.destroy();
- Cluster cluster;
- try {
- TopologyManager.acquireReadLockForCluster(serviceType, clusterId);
- cluster = TopologyManager.getTopology().getService(serviceType).getCluster(clusterId);
- }
- finally {
- TopologyManager.releaseReadLockForCluster(serviceType, clusterId);
- }
+ if (applicationMonitor.hasInstance()) {
+ Map<String, Monitor> monitors = applicationMonitor.
+ getAliasToActiveChildMonitorsMap();
+ AutoscalerUtil.handleForceTermination(monitors.values(),
+ applicationMonitor, applicationId);
- //If there are no members in cluster Instance, send cluster Terminated Event
- //Stopping the cluster monitor thread
- ClusterMonitor clusterMonitor = AutoscalerContext.getInstance().
- getClusterMonitor(clusterId);
- if (clusterMonitor != null) {
- clusterMonitor.destroy();
- } else {
- if (log.isDebugEnabled()) {
- log.debug(String.format("Cluster monitor cannot be found for [application] %s " +
- "[cluster] %s", applicationId, clusterId));
- }
- }
- if (cluster != null) {
- Collection<ClusterInstance> allClusterInstances = cluster.getClusterInstances();
- for (ClusterInstance clusterInstance : allClusterInstances) {
- ClusterStatusEventPublisher.sendClusterTerminatedEvent(applicationId, cluster.getServiceName(),
- clusterId, clusterInstance.getInstanceId());
+ Collection<Instance> applicationInstances = applicationMonitor.getInstances();
+ for (Instance instance : applicationInstances) {
+ ApplicationBuilder.handleApplicationInstanceTerminatedEvent(applicationId,
+ instance.getInstanceId());
}
- List<String> memberListToTerminate = new LinkedList<String>();
- for (Member member : cluster.getMembers()) {
- memberListToTerminate.add(member.getMemberId());
- }
+ Set<ClusterDataHolder> allClusters = application.getClusterDataRecursively();
+ for (ClusterDataHolder clusterDataHolder : allClusters) {
+ String serviceType = clusterDataHolder.getServiceType();
+ String clusterId = clusterDataHolder.getClusterId();
- for (String memberIdToTerminate : memberListToTerminate) {
+ Cluster cluster;
try {
- log.info(String.format(
- "Terminating member forcefully [member-id] %s of the cluster [cluster-id] %s " +
- "[application-id] %s", memberIdToTerminate, clusterId, application));
- AutoscalerCloudControllerClient.getInstance().terminateInstanceForcefully(memberIdToTerminate);
+ TopologyManager.acquireReadLockForCluster(serviceType, clusterId);
+ cluster = TopologyManager.getTopology().getService(serviceType).getCluster(clusterId);
+ } finally {
+ TopologyManager.releaseReadLockForCluster(serviceType, clusterId);
+ }
+
+ //If there are no members in cluster Instance, send cluster Terminated Event
+ //Stopping the cluster monitor thread
+ ClusterMonitor clusterMonitor = AutoscalerContext.getInstance().
+ getClusterMonitor(clusterId);
+ if (clusterMonitor != null) {
+ clusterMonitor.destroy();
+ } else {
+ if (log.isDebugEnabled()) {
+ log.debug(String.format("Cluster monitor cannot be found for [application] %s " +
+ "[cluster] %s", applicationId, clusterId));
+ }
}
- catch (Exception e) {
- log.error(
- String.format("Forceful termination of member %s has failed, but continuing forceful " +
- "deletion of other members", memberIdToTerminate));
+ if (cluster != null) {
+ Collection<ClusterInstance> allClusterInstances = cluster.getClusterInstances();
+
+ if (allClusterInstances.isEmpty() && clusterMonitor != null) {
+ AutoscalerContext.getInstance().removeClusterMonitor(clusterId);
+ }
+
+ List<String> memberListToTerminate = new LinkedList<String>();
+ for (Member member : cluster.getMembers()) {
+ memberListToTerminate.add(member.getMemberId());
+ }
+
+ for (String memberIdToTerminate : memberListToTerminate) {
+ try {
+ log.info(String.format(
+ "Terminating member forcefully [member-id] %s of the cluster [cluster-id] %s " +
+ "[application-id] %s", memberIdToTerminate, clusterId, application));
+ AutoscalerCloudControllerClient.getInstance().terminateInstanceForcefully(memberIdToTerminate);
+ } catch (Exception e) {
+ log.error(
+ String.format("Forceful termination of member %s has failed, but continuing forceful " +
+ "deletion of other members", memberIdToTerminate));
+ }
+ }
}
+
}
- }
+ } else {
+ //There is no application instances. Need to directly un-deploy the application
+ // stopping application thread
+ ApplicationContext applicationContext = AutoscalerContext.getInstance().
+ getApplicationContext(applicationId);
+ applicationMonitor.destroy();
+ AutoscalerContext.getInstance().removeAppMonitor(applicationId);
+ // Remove network partition algorithm context
+ AutoscalerContext.getInstance().removeNetworkPartitionAlgorithmContext(applicationId);
+ // update application status in application context
+ applicationContext.setStatus(ApplicationContext.STATUS_CREATED);
+ AutoscalerContext.getInstance().updateApplicationContext(applicationContext);
+ RegistryManager.getInstance().persistApplicationContext(applicationContext);
+ log.info("Application un-deployed successfully: [application-id] " + applicationId);
+ }
}
+
+
+
+
}
@@ -1137,7 +1164,7 @@ public class AutoscalerServiceImpl implements AutoscalerService {
PartitionRef[] partitions = networkPartitionRef.getPartitionRefs();
if (null == partitions || partitions.length == 0) {
String msg = String.format("Network partition does not have any partition references: "
- + "[deployment-policy-id] %s [network-partition-id] %s", deploymentPolicyId,
+ + "[deployment-policy-id] %s [network-partition-id] %s", deploymentPolicyId,
networkPartitionId);
log.error(msg);
throw new InvalidDeploymentPolicyException(msg);
@@ -1190,23 +1217,20 @@ public class AutoscalerServiceImpl implements AutoscalerService {
addNewPartitionsToClusterMonitor(clusterLevelNetworkPartitionContext, networkPartition,
deploymentPolicy.getDeploymentPolicyID(),
clusterMonitor.getClusterContext().getServiceId());
- }
- catch (RemoteException e) {
+ } catch (RemoteException e) {
String message =
"Connection to cloud controller failed, Cluster monitor update failed for" +
" [deployment-policy] " + deploymentPolicy.getDeploymentPolicyID();
log.error(message);
throw new CloudControllerConnectionException(message, e);
- }
- catch (CloudControllerServiceInvalidPartitionExceptionException e) {
+ } catch (CloudControllerServiceInvalidPartitionExceptionException e) {
String message = "Invalid partition, Cluster monitor update failed for [deployment-policy] "
+ deploymentPolicy.getDeploymentPolicyID();
log.error(message);
throw new InvalidDeploymentPolicyException(message, e);
- }
- catch (CloudControllerServiceInvalidCartridgeTypeExceptionException e) {
+ } catch (CloudControllerServiceInvalidCartridgeTypeExceptionException e) {
String message =
"Invalid cartridge type, Cluster monitor update failed for [deployment-policy] "
@@ -1325,8 +1349,7 @@ public class AutoscalerServiceImpl implements AutoscalerService {
try {
Collection<DeploymentPolicy> deploymentPolicies = PolicyManager.getInstance().getDeploymentPolicies();
return deploymentPolicies.toArray(new DeploymentPolicy[deploymentPolicies.size()]);
- }
- catch (Exception e) {
+ } catch (Exception e) {
String message = "Could not get deployment policies";
log.error(message);
throw new AutoScalerException(message, e);
http://git-wip-us.apache.org/repos/asf/stratos/blob/45228ba3/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java
index 3d80094..a639673 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java
@@ -31,10 +31,12 @@ import org.apache.stratos.autoscaler.applications.pojo.ApplicationContext;
import org.apache.stratos.autoscaler.applications.pojo.CartridgeContext;
import org.apache.stratos.autoscaler.applications.pojo.ComponentContext;
import org.apache.stratos.autoscaler.applications.pojo.GroupContext;
+import org.apache.stratos.autoscaler.applications.topic.ApplicationBuilder;
import org.apache.stratos.autoscaler.context.AutoscalerContext;
import org.apache.stratos.autoscaler.context.InstanceContext;
import org.apache.stratos.autoscaler.context.cluster.ClusterInstanceContext;
import org.apache.stratos.autoscaler.context.partition.network.NetworkPartitionContext;
+import org.apache.stratos.autoscaler.event.publisher.ClusterStatusEventPublisher;
import org.apache.stratos.autoscaler.exception.AutoScalerException;
import org.apache.stratos.autoscaler.exception.application.*;
import org.apache.stratos.autoscaler.exception.policy.ApplicatioinPolicyNotExistsException;
@@ -44,10 +46,12 @@ import org.apache.stratos.autoscaler.monitor.MonitorFactory;
import org.apache.stratos.autoscaler.monitor.cluster.ClusterMonitor;
import org.apache.stratos.autoscaler.monitor.component.ApplicationMonitor;
import org.apache.stratos.autoscaler.monitor.component.GroupMonitor;
+import org.apache.stratos.autoscaler.monitor.component.ParentComponentMonitor;
import org.apache.stratos.autoscaler.pojo.policy.PolicyManager;
import org.apache.stratos.autoscaler.pojo.policy.deployment.ApplicationPolicy;
import org.apache.stratos.autoscaler.pojo.policy.deployment.DeploymentPolicy;
import org.apache.stratos.autoscaler.registry.RegistryManager;
+import org.apache.stratos.cloud.controller.stub.domain.MemberContext;
import org.apache.stratos.common.Properties;
import org.apache.stratos.common.Property;
import org.apache.stratos.common.client.CloudControllerServiceClient;
@@ -57,6 +61,7 @@ import org.apache.stratos.messaging.domain.application.Application;
import org.apache.stratos.messaging.domain.application.Applications;
import org.apache.stratos.messaging.domain.application.ClusterDataHolder;
import org.apache.stratos.messaging.domain.application.Group;
+import org.apache.stratos.messaging.domain.instance.Instance;
import org.apache.stratos.messaging.domain.topology.Service;
import org.apache.stratos.messaging.domain.topology.Topology;
import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
@@ -1017,4 +1022,37 @@ public class AutoscalerUtil {
}
}
+
+ public static void handleForceTermination(Collection<Monitor> monitors, Monitor parentMonitor, String applicationId) {
+ Iterator<Monitor> monitorsIter = monitors.iterator();
+ while(monitorsIter.hasNext()) {
+ Monitor monitor = monitorsIter.next();
+ monitor.destroy();
+ Iterator<Instance> instances = monitor.getInstances().iterator();
+ while(instances.hasNext()) {
+ Instance instance = instances.next();
+ if (monitor instanceof GroupMonitor) {
+ ApplicationBuilder.handleGroupInstanceTerminatedEvent(applicationId,
+ monitor.getId(), instance.getInstanceId());
+ } else {
+ ClusterStatusEventPublisher.sendClusterTerminatedEvent(applicationId,
+ ((ClusterMonitor) monitor).getServiceId(), monitor.getId(), instance.getInstanceId());
+ }
+ }
+ if(monitor instanceof ParentComponentMonitor) {
+ ParentComponentMonitor pMonitor = (ParentComponentMonitor)parentMonitor;
+ if (!monitor.hasInstance()) {
+ (pMonitor).removeMonitor(monitor.getId());
+ }
+ Collection<Monitor> childMonitors = pMonitor.
+ getAliasToActiveChildMonitorsMap().values();
+ if(!childMonitors.isEmpty()) {
+ handleForceTermination(childMonitors, monitor, applicationId);
+ }
+ }
+
+ }
+
+ }
+
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/45228ba3/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db-1.log
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db-1.log b/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db-1.log
new file mode 100644
index 0000000..f63147c
Binary files /dev/null and b/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db-1.log differ
http://git-wip-us.apache.org/repos/asf/stratos/blob/45228ba3/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db.data
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db.data b/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db.data
new file mode 100644
index 0000000..e3832b7
Binary files /dev/null and b/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db.data differ
http://git-wip-us.apache.org/repos/asf/stratos/blob/45228ba3/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db.redo
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db.redo b/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db.redo
new file mode 100644
index 0000000..b03cc50
Binary files /dev/null and b/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db.redo differ
http://git-wip-us.apache.org/repos/asf/stratos/blob/45228ba3/products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/application/ApplicationUpdateTest.java
----------------------------------------------------------------------
diff --git a/products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/application/ApplicationUpdateTest.java b/products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/application/ApplicationUpdateTest.java
index 7148660..a7c1a89 100644
--- a/products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/application/ApplicationUpdateTest.java
+++ b/products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/application/ApplicationUpdateTest.java
@@ -24,16 +24,11 @@ import org.apache.commons.logging.LogFactory;
import org.apache.stratos.common.beans.application.ApplicationBean;
import org.apache.stratos.common.beans.cartridge.CartridgeGroupBean;
import org.apache.stratos.common.beans.policy.deployment.ApplicationPolicyBean;
-<<<<<<< HEAD:products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/application/ApplicationUpdateTest.java
import org.apache.stratos.integration.common.RestConstants;
import org.apache.stratos.integration.common.TopologyHandler;
import org.apache.stratos.integration.tests.StratosIntegrationTest;
-=======
-import org.apache.stratos.integration.tests.RestConstants;
-import org.apache.stratos.integration.tests.StratosTestServerManager;
-import org.apache.stratos.integration.tests.TopologyHandler;
+import org.apache.stratos.integration.common.TopologyHandler;
import org.apache.stratos.messaging.domain.application.Application;
->>>>>>> Support application update in the Applications Topology:products/stratos/modules/integration/src/test/java/org/apache/stratos/integration/tests/application/ApplicationUpdateTest.java
import org.apache.stratos.messaging.domain.application.ApplicationStatus;
import org.apache.stratos.messaging.domain.application.ClusterDataHolder;
import org.apache.stratos.messaging.domain.application.Group;
[2/3] stratos git commit: Support application update in the
Applications Topology
Posted by re...@apache.org.
Support application update in the Applications Topology
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/21e6c208
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/21e6c208
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/21e6c208
Branch: refs/heads/stratos-4.1.x
Commit: 21e6c20815dadab33db5ba61aaf3c1569848afa5
Parents: b5d1020
Author: reka <rt...@gmail.com>
Authored: Thu Sep 10 16:56:57 2015 +0530
Committer: reka <rt...@gmail.com>
Committed: Wed Sep 16 10:49:03 2015 +0530
----------------------------------------------------------------------
.../topic/ApplicationsEventPublisher.java | 20 +++
.../services/impl/AutoscalerServiceImpl.java | 3 +
.../application/ApplicationUpdatedEvent.java | 43 ++++++
.../ApplicationUpdatedEventListener.java | 27 ++++
.../ApplicationUpdatedMessageProcessor.java | 152 +++++++++++++++++++
.../ApplicationsMessageProcessorChain.java | 6 +
.../application/ApplicationUpdateTest.java | 37 ++++-
7 files changed, 283 insertions(+), 5 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/stratos/blob/21e6c208/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationsEventPublisher.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationsEventPublisher.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationsEventPublisher.java
index a5abc26..f66e525 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationsEventPublisher.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationsEventPublisher.java
@@ -44,15 +44,35 @@ public class ApplicationsEventPublisher {
}
public static void sendApplicationCreatedEvent(Application application) {
+ if(log.isInfoEnabled()) {
+ log.info("Sending application created event for [application] " +
+ application.getUniqueIdentifier());
+ }
publishEvent(new ApplicationCreatedEvent(application));
}
+ public static void sendApplicationUpdated(Application application) {
+ if(log.isInfoEnabled()) {
+ log.info("Sending application updated event for [application] " +
+ application.getUniqueIdentifier());
+ }
+ publishEvent(new ApplicationUpdatedEvent(application));
+ }
+
public static void sendApplicationDeletedEvent(String appId, Set<ClusterDataHolder> clusterData) {
+ if(log.isInfoEnabled()) {
+ log.info("Sending application deleted event for [application] " +
+ appId);
+ }
publishEvent(new ApplicationDeletedEvent(appId, clusterData));
}
public static void sendApplicationInstanceCreatedEvent(String appId,
ApplicationInstance applicationInstance) {
+ if(log.isInfoEnabled()) {
+ log.info("Sending application instnace created event for [application] " +
+ appId + " [instance] " + applicationInstance.getInstanceId());
+ }
publishEvent(new ApplicationInstanceCreatedEvent(appId, applicationInstance));
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/21e6c208/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/services/impl/AutoscalerServiceImpl.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/services/impl/AutoscalerServiceImpl.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/services/impl/AutoscalerServiceImpl.java
index 47b03bb..d9023f7 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/services/impl/AutoscalerServiceImpl.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/services/impl/AutoscalerServiceImpl.java
@@ -200,6 +200,9 @@ public class AutoscalerServiceImpl implements AutoscalerService {
//updating the applicationContext
AutoscalerContext.getInstance().updateApplicationContext(applicationContext);
+ //Send application Updated event
+ ApplicationsEventPublisher.sendApplicationUpdated(application);
+
if (log.isInfoEnabled()) {
log.info(String.format("Application updated successfully: [application-id] %s",
applicationId));
http://git-wip-us.apache.org/repos/asf/stratos/blob/21e6c208/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/application/ApplicationUpdatedEvent.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/application/ApplicationUpdatedEvent.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/application/ApplicationUpdatedEvent.java
new file mode 100644
index 0000000..4c2f7e0
--- /dev/null
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/application/ApplicationUpdatedEvent.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.stratos.messaging.event.application;
+
+import org.apache.stratos.messaging.domain.application.Application;
+import org.apache.stratos.messaging.event.Event;
+
+import java.io.Serializable;
+
+/**
+ * This event will be fired upon the application updated is detected.
+ */
+public class ApplicationUpdatedEvent extends Event implements Serializable {
+
+ private static final long serialVersionUID = 2625412714611885089L;
+
+ private Application application;
+
+ public ApplicationUpdatedEvent(Application application) {
+ this.application = application;
+ }
+
+ public Application getApplication() {
+ return application;
+ }
+}
http://git-wip-us.apache.org/repos/asf/stratos/blob/21e6c208/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/listener/application/ApplicationUpdatedEventListener.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/listener/application/ApplicationUpdatedEventListener.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/listener/application/ApplicationUpdatedEventListener.java
new file mode 100644
index 0000000..fc02e59
--- /dev/null
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/listener/application/ApplicationUpdatedEventListener.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.stratos.messaging.listener.application;
+
+import org.apache.stratos.messaging.listener.EventListener;
+
+/**
+ * This will get triggered when application update happens
+ */
+abstract class ApplicationUpdatedEventListener extends EventListener {
+}
http://git-wip-us.apache.org/repos/asf/stratos/blob/21e6c208/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/application/ApplicationUpdatedMessageProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/application/ApplicationUpdatedMessageProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/application/ApplicationUpdatedMessageProcessor.java
new file mode 100644
index 0000000..99282ca
--- /dev/null
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/application/ApplicationUpdatedMessageProcessor.java
@@ -0,0 +1,152 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.stratos.messaging.message.processor.application;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.messaging.domain.application.Application;
+import org.apache.stratos.messaging.domain.application.Applications;
+import org.apache.stratos.messaging.domain.application.ClusterDataHolder;
+import org.apache.stratos.messaging.domain.application.Group;
+import org.apache.stratos.messaging.event.application.ApplicationCreatedEvent;
+import org.apache.stratos.messaging.event.application.ApplicationUpdatedEvent;
+import org.apache.stratos.messaging.message.processor.MessageProcessor;
+import org.apache.stratos.messaging.message.processor.application.updater.ApplicationsUpdater;
+import org.apache.stratos.messaging.util.MessagingUtil;
+
+import java.util.Set;
+
+public class ApplicationUpdatedMessageProcessor extends MessageProcessor {
+
+ private static final Log log = LogFactory.getLog(ApplicationUpdatedMessageProcessor.class);
+ private MessageProcessor nextProcessor;
+
+ @Override
+ public void setNext(MessageProcessor nextProcessor) {
+ this.nextProcessor = nextProcessor;
+ }
+
+ @Override
+ public boolean process(String type, String message, Object object) {
+
+ Applications applications = (Applications) object;
+
+ if (ApplicationUpdatedEvent.class.getName().equals(type)) {
+ if (!applications.isInitialized()) {
+ return false;
+ }
+
+ ApplicationUpdatedEvent event = (ApplicationUpdatedEvent) MessagingUtil.
+ jsonToObject(message, ApplicationUpdatedEvent.class);
+ if (event == null) {
+ log.error("Unable to convert the JSON message to ApplicationCreatedEvent");
+ return false;
+ }
+
+ ApplicationsUpdater.acquireWriteLockForApplications();
+ try {
+ return doProcess(event, applications);
+
+ } finally {
+ ApplicationsUpdater.releaseWriteLockForApplications();
+ }
+
+ } else {
+ if (nextProcessor != null) {
+ // ask the next processor to take care of the message.
+ return nextProcessor.process(type, message, applications);
+ } else {
+ throw new RuntimeException(String.format("Failed to process message using available message processors: [type] %s [body] %s", type, message));
+ }
+ }
+ }
+
+ private boolean doProcess(ApplicationUpdatedEvent event, Applications applications) {
+
+ // check if required properties are available
+ if (event.getApplication() == null) {
+ String errorMsg = "Application object of application updated event is invalid";
+ log.error(errorMsg);
+ throw new RuntimeException(errorMsg);
+ }
+
+ if (event.getApplication().getUniqueIdentifier() == null ||
+ event.getApplication().getUniqueIdentifier().isEmpty()) {
+ String errorMsg = "App id of application updated event is invalid: [ " + event.getApplication().getUniqueIdentifier() + " ]";
+ log.error(errorMsg);
+ throw new RuntimeException(errorMsg);
+ }
+
+ // check if an Application with same name exists in applications
+ if (applications.applicationExists(event.getApplication().getUniqueIdentifier())) {
+ Application updatedApplication = event.getApplication();
+ // add application update to applications Topology
+ Application application = applications.
+ getApplication(event.getApplication().getUniqueIdentifier());
+ //Update Application Recursively
+ Set<Group> groups = application.getAllGroupsRecursively();
+ for (Group group : groups) {
+ Group updatedGroup = updatedApplication.getGroupRecursively(group.getUniqueIdentifier());
+
+ if (updatedGroup != null) {
+ group.setGroupMaxInstances(updatedGroup.getGroupMaxInstances());
+ group.setGroupMinInstances(updatedGroup.getGroupMinInstances());
+ } else {
+ log.warn("[Goup] " + group.getUniqueIdentifier() +
+ " cannot be found in [application] " + application.getUniqueIdentifier());
+ }
+
+ }
+
+ Set<ClusterDataHolder> clusterDataHolders = application.getClusterDataRecursively();
+ for (ClusterDataHolder dataHolder : clusterDataHolders) {
+ Set<ClusterDataHolder> updatedClusters = updatedApplication.
+ getClusterDataRecursively();
+ boolean clusterFound = false;
+ for(ClusterDataHolder updatedCluster : updatedClusters) {
+ if (updatedCluster.getClusterId().equals(dataHolder.getClusterId())) {
+ dataHolder.setMinInstances(updatedCluster.getMinInstances());
+ dataHolder.setMaxInstances(updatedCluster.getMaxInstances());
+ clusterFound = true;
+ break;
+ }
+ }
+ if(!clusterFound) {
+ log.warn("[Cluster] " + dataHolder.getClusterId() +
+ " cannot be found in [application] " + application.getUniqueIdentifier());
+ }
+
+ }
+
+
+ if (log.isInfoEnabled()) {
+ log.info("Application with id [ " + event.getApplication().getUniqueIdentifier() + " ] updated");
+ }
+ } else {
+ if (log.isDebugEnabled()) {
+ log.debug("Application with id [ " + event.getApplication().getUniqueIdentifier() + " ] not exists");
+ }
+
+ }
+
+ notifyEventListeners(event);
+ return true;
+ }
+}
http://git-wip-us.apache.org/repos/asf/stratos/blob/21e6c208/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/application/ApplicationsMessageProcessorChain.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/application/ApplicationsMessageProcessorChain.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/application/ApplicationsMessageProcessorChain.java
index b92a236..bed9b0d 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/application/ApplicationsMessageProcessorChain.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/application/ApplicationsMessageProcessorChain.java
@@ -39,6 +39,7 @@ public class ApplicationsMessageProcessorChain extends MessageProcessorChain {
private ApplicationInstanceCreatedMessageProcessor applicationInstanceCreatedMessageProcessor;
private ApplicationInstanceActivatedMessageProcessor applicationActivatedMessageProcessor;
private ApplicationCreatedMessageProcessor applicationCreatedMessageProcessor;
+ private ApplicationUpdatedMessageProcessor applicationUpdatedMessageProcessor;
private ApplicationDeletedMessageProcessor applicationDeletedMessageProcessor;
private ApplicationInstanceInactivatedMessageProcessor applicationInactivatedMessageProcessor;
private ApplicationInstanceTerminatedMessageProcessor applicationTerminatedMessageProcessor;
@@ -67,6 +68,9 @@ public class ApplicationsMessageProcessorChain extends MessageProcessorChain {
applicationInstanceCreatedMessageProcessor = new ApplicationInstanceCreatedMessageProcessor();
add(applicationInstanceCreatedMessageProcessor);
+ applicationUpdatedMessageProcessor = new ApplicationUpdatedMessageProcessor();
+ add(applicationUpdatedMessageProcessor);
+
applicationActivatedMessageProcessor = new ApplicationInstanceActivatedMessageProcessor();
add(applicationActivatedMessageProcessor);
@@ -112,6 +116,8 @@ public class ApplicationsMessageProcessorChain extends MessageProcessorChain {
applicationInstanceCreatedMessageProcessor.addEventListener(eventListener);
} else if (eventListener instanceof ApplicationCreatedEventListener) {
applicationCreatedMessageProcessor.addEventListener(eventListener);
+ } else if (eventListener instanceof ApplicationUndeployedEventListener) {
+ applicationUpdatedMessageProcessor.addEventListener(eventListener);
} else if (eventListener instanceof ApplicationDeletedEventListener) {
applicationDeletedMessageProcessor.addEventListener(eventListener);
} else if (eventListener instanceof ApplicationInstanceActivatedEventListener) {
http://git-wip-us.apache.org/repos/asf/stratos/blob/21e6c208/products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/application/ApplicationUpdateTest.java
----------------------------------------------------------------------
diff --git a/products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/application/ApplicationUpdateTest.java b/products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/application/ApplicationUpdateTest.java
index b07ea2f..7148660 100644
--- a/products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/application/ApplicationUpdateTest.java
+++ b/products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/application/ApplicationUpdateTest.java
@@ -24,10 +24,20 @@ import org.apache.commons.logging.LogFactory;
import org.apache.stratos.common.beans.application.ApplicationBean;
import org.apache.stratos.common.beans.cartridge.CartridgeGroupBean;
import org.apache.stratos.common.beans.policy.deployment.ApplicationPolicyBean;
+<<<<<<< HEAD:products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/application/ApplicationUpdateTest.java
import org.apache.stratos.integration.common.RestConstants;
import org.apache.stratos.integration.common.TopologyHandler;
import org.apache.stratos.integration.tests.StratosIntegrationTest;
+=======
+import org.apache.stratos.integration.tests.RestConstants;
+import org.apache.stratos.integration.tests.StratosTestServerManager;
+import org.apache.stratos.integration.tests.TopologyHandler;
+import org.apache.stratos.messaging.domain.application.Application;
+>>>>>>> Support application update in the Applications Topology:products/stratos/modules/integration/src/test/java/org/apache/stratos/integration/tests/application/ApplicationUpdateTest.java
import org.apache.stratos.messaging.domain.application.ApplicationStatus;
+import org.apache.stratos.messaging.domain.application.ClusterDataHolder;
+import org.apache.stratos.messaging.domain.application.Group;
+import org.apache.stratos.messaging.message.receiver.application.ApplicationManager;
import org.testng.annotations.Test;
import static junit.framework.Assert.assertEquals;
@@ -134,14 +144,31 @@ public class ApplicationUpdateTest extends StratosIntegrationTest {
RestConstants.APPLICATIONS_NAME);
assertEquals(updated, true);
- topologyHandler.assertGroupInstanceCount(bean.getApplicationId(), "group3-application-update-test", 2);
-
- topologyHandler.assertClusterMinMemberCount(bean.getApplicationId(), 2);
-
ApplicationBean updatedBean = (ApplicationBean) restClient.getEntity(RestConstants.APPLICATIONS,
"g-sc-G123-1-application-update-test", ApplicationBean.class, RestConstants.APPLICATIONS_NAME);
assertEquals(updatedBean.getApplicationId(), "g-sc-G123-1-application-update-test");
+ //Need to validate whether the updated taken into the applications Topology
+ Application application = ApplicationManager.getApplications().
+ getApplication(bean.getApplicationId());
+
+ Group group = application.getGroupRecursively("group3-application-update-test");
+ assertEquals(group.getGroupMaxInstances(), 3);
+ assertEquals(group.getGroupMinInstances(), 2);
+ log.info("Application update is successfully done for [application] " +
+ bean.getApplicationId() + " [group] " + group.getUniqueIdentifier());
+
+ ClusterDataHolder clusterDataHolder = application.
+ getClusterDataHolderRecursivelyByAlias("c3-1x0-application-update-test");
+ assertEquals(clusterDataHolder.getMaxInstances(), 3);
+ assertEquals(clusterDataHolder.getMinInstances(), 2);
+ log.info("Application update is successfully done for [application] " +
+ bean.getApplicationId() + " [Cluster] " + clusterDataHolder.getClusterId());
+
+ topologyHandler.assertGroupInstanceCount(bean.getApplicationId(), "group3-application-update-test", 2);
+
+ topologyHandler.assertClusterMinMemberCount(bean.getApplicationId(), 2);
+
boolean removedGroup = restClient.removeEntity(RestConstants.CARTRIDGE_GROUPS, "G1-application-update-test",
RestConstants.CARTRIDGE_GROUPS_NAME);
assertEquals(removedGroup, false);
@@ -244,4 +271,4 @@ public class ApplicationUpdateTest extends StratosIntegrationTest {
assertTrue("An error occurred while handling application deployment/undeployment and update", false);
}
}
-}
\ No newline at end of file
+}
[3/3] stratos git commit: removing unnecessary files
Posted by re...@apache.org.
removing unnecessary files
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/70eaa362
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/70eaa362
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/70eaa362
Branch: refs/heads/stratos-4.1.x
Commit: 70eaa362d0e1c0b3b5f96a5f11efd3266c3cdb4c
Parents: 45228ba
Author: reka <rt...@gmail.com>
Authored: Wed Sep 16 10:49:36 2015 +0530
Committer: reka <rt...@gmail.com>
Committed: Wed Sep 16 10:49:36 2015 +0530
----------------------------------------------------------------------
.../activemq-data/testBroker/KahaDB/db-1.log | Bin 33030144 -> 0 bytes
.../activemq-data/testBroker/KahaDB/db.data | Bin 49152 -> 0 bytes
.../activemq-data/testBroker/KahaDB/db.redo | Bin 49240 -> 0 bytes
3 files changed, 0 insertions(+), 0 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/stratos/blob/70eaa362/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db-1.log
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db-1.log b/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db-1.log
deleted file mode 100644
index f63147c..0000000
Binary files a/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db-1.log and /dev/null differ
http://git-wip-us.apache.org/repos/asf/stratos/blob/70eaa362/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db.data
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db.data b/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db.data
deleted file mode 100644
index e3832b7..0000000
Binary files a/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db.data and /dev/null differ
http://git-wip-us.apache.org/repos/asf/stratos/blob/70eaa362/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db.redo
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db.redo b/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db.redo
deleted file mode 100644
index b03cc50..0000000
Binary files a/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db.redo and /dev/null differ