changes for Life Cycle State Manager contd.
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/cd66b40a Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/cd66b40a Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/cd66b40a Branch: refs/heads/4.0.0-grouping Commit: cd66b40a74510f57bda3e9486451f948806cc320 Parents: 17d68ab Author: Isuru Haththotuwa <[email protected]> Authored: Sun Oct 19 08:41:02 2014 +0530 Committer: Isuru Haththotuwa <[email protected]> Committed: Sun Oct 19 09:42:42 2014 +0530 ---------------------------------------------------------------------- .../monitor/ApplicationMonitorFactory.java | 8 +-- .../autoscaler/monitor/group/GroupMonitor.java | 3 +- .../status/checker/StatusChecker.java | 2 +- .../controller/topology/TopologyBuilder.java | 9 ++- .../messaging/domain/topology/Application.java | 27 +++++++- .../domain/topology/ApplicationStatus.java | 71 ++++++++++++++++++++ .../messaging/domain/topology/Cluster.java | 12 +++- .../domain/topology/ClusterStatus.java | 24 +++++-- .../messaging/domain/topology/Group.java | 30 ++++++++- .../messaging/domain/topology/GroupStatus.java | 70 +++++++++++++++++++ .../messaging/domain/topology/Member.java | 3 +- .../messaging/domain/topology/MemberStatus.java | 14 ++-- .../domain/topology/ParentComponent.java | 12 ++-- .../lifecycle/LifeCycleStateManager.java | 43 ++++++++++-- .../domain/topology/util/GroupStatus.java | 40 ----------- .../ApplicationActivatedMessageProcessor.java | 2 +- .../topology/ClusterActivatedProcessor.java | 2 + .../ClusterMaintenanceModeMessageProcessor.java | 2 + .../topology/GroupActivatedProcessor.java | 5 +- 19 files changed, 301 insertions(+), 78 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/stratos/blob/cd66b40a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ApplicationMonitorFactory.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ApplicationMonitorFactory.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ApplicationMonitorFactory.java index 86e0931..361e89a 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ApplicationMonitorFactory.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ApplicationMonitorFactory.java @@ -106,10 +106,10 @@ public class ApplicationMonitorFactory { groupMonitor = new GroupMonitor(group, appId); groupMonitor.setAppId(appId); groupMonitor.setParent(parentMonitor); - if (group.getStatus() != groupMonitor.getStatus()) { + if (group.getTempStatus() != groupMonitor.getStatus()) { //updating the status, if the group is not in created state when creating group Monitor //so that groupMonitor will notify the parent (useful when restarting stratos) - groupMonitor.setStatus(group.getStatus()); + groupMonitor.setStatus(group.getTempStatus()); } } finally { TopologyManager.releaseReadLockForApplication(appId); @@ -290,9 +290,9 @@ public class ApplicationMonitorFactory { } } - if (cluster.getStatus() != clusterMonitor.getStatus()) { + if (cluster.getTempStatus() != clusterMonitor.getStatus()) { //updating the status, so that it will notify the parent - clusterMonitor.setStatus(cluster.getStatus()); + clusterMonitor.setStatus(cluster.getTempStatus()); } } finally { //release read lock for the service and cluster http://git-wip-us.apache.org/repos/asf/stratos/blob/cd66b40a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/group/GroupMonitor.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/group/GroupMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/group/GroupMonitor.java index 9f83578..9e36622 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/group/GroupMonitor.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/group/GroupMonitor.java @@ -54,7 +54,7 @@ public class GroupMonitor extends ParentComponentMonitor implements EventHandler TopologyInConsistentException { super(group); this.appId = appId; - this.setStatus(group.getStatus()); + this.setStatus(group.getTempStatus()); startDependency(); } @@ -92,6 +92,7 @@ public class GroupMonitor extends ParentComponentMonitor implements EventHandler log.error(e); } } else if (status1 == Status.In_Active) { + //TODO if C1 depends on C2, then if C2 is in_active, then by getting killdepend as C1 and //TODO need to send in_active for c1. When C1 in_active receives, get dependent and //TODO check whether dependent in_active. Then kill c1. http://git-wip-us.apache.org/repos/asf/stratos/blob/cd66b40a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/StatusChecker.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/StatusChecker.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/StatusChecker.java index ff45af1..c59313c 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/StatusChecker.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/StatusChecker.java @@ -267,7 +267,7 @@ public class StatusChecker { private boolean getGroupStatus(Map<String, Group> groups) { boolean groupActiveStatus = false; for (Group group : groups.values()) { - if (group.getStatus() == Status.Activated) { + if (group.getTempStatus() == Status.Activated) { groupActiveStatus = true; } else { groupActiveStatus = false; http://git-wip-us.apache.org/repos/asf/stratos/blob/cd66b40a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyBuilder.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyBuilder.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyBuilder.java index 9f74524..b9fb581 100644 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyBuilder.java +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyBuilder.java @@ -213,6 +213,8 @@ public class TopologyBuilder { log.error("Invalid State Transition from " + cluster.getStatus() + " to " + ClusterStatus.Inactive); } cluster.setStatus(ClusterStatus.Inactive); + // temporary; should be removed + cluster.setTempStatus(Status.In_Active); //cluster.setStatus(Status.In_Maintenance); TopologyManager.updateTopology(topology); } finally { @@ -774,6 +776,9 @@ public class TopologyBuilder { TopologyManager.acquireWriteLock(); //cluster.setStatus(Status.Activated); cluster.setStatus(ClusterStatus.Active); + // temporary; should be removed + cluster.setTempStatus(Status.Activated); + log.info("Cluster activated adding status started"); TopologyManager.updateTopology(topology); @@ -807,7 +812,7 @@ public class TopologyBuilder { groupActivatedEvent.getGroupId()); try { TopologyManager.acquireWriteLock(); - group.setStatus(Status.Activated); + group.setTempStatus(Status.Activated); log.info("Group activated adding status started"); TopologyManager.updateTopology(topology); @@ -833,7 +838,7 @@ public class TopologyBuilder { applicationActivatedEvent.getAppId()); try { TopologyManager.acquireWriteLock(); - application.setStatus(Status.Activated); + application.setTempStatus(Status.Activated); log.info("Application activated adding status started for Topology"); TopologyManager.updateTopology(topology); http://git-wip-us.apache.org/repos/asf/stratos/blob/cd66b40a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Application.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Application.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Application.java index c30d5b7..ecca8df 100644 --- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Application.java +++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Application.java @@ -20,6 +20,7 @@ package org.apache.stratos.messaging.domain.topology; import org.apache.commons.lang3.RandomStringUtils; +import org.apache.stratos.messaging.domain.topology.lifecycle.LifeCycleStateManager; import java.util.*; @@ -27,7 +28,7 @@ import java.util.*; * Represents an Application in the Topology */ -public class Application extends ParentComponent { +public class Application extends ParentComponent implements LifeCycleStateTransitionBehavior<ApplicationStatus> { private static final long serialVersionUID = -5092959597171649688L; // Unique id for the Application, defined in Application Definition @@ -40,11 +41,15 @@ public class Application extends ParentComponent { private String tenantDomain; // tenant admin user private String tenantAdminUserName; + // Life cycle state manager + protected LifeCycleStateManager<ApplicationStatus> applicationStateManager; public Application (String id) { super(); this.id = id; this.key = RandomStringUtils.randomAlphanumeric(16); + this.applicationStateManager = + new LifeCycleStateManager<ApplicationStatus>(ApplicationStatus.Created); } public String getUniqueIdentifier() { @@ -79,6 +84,26 @@ public class Application extends ParentComponent { this.tenantAdminUserName = tenantAdminUserName; } + @Override + public boolean isStateTransitionValid(ApplicationStatus newState) { + return this.applicationStateManager.isStateTransitionValid(newState); + } + + @Override + public Stack<ApplicationStatus> getTransitionedStates() { + return this.applicationStateManager.getStateStack(); + } + + @Override + public ApplicationStatus getStatus() { + return this.applicationStateManager.getCurrentState(); + } + + @Override + public void setStatus(ApplicationStatus newState) { + this.applicationStateManager.changeState(newState); + } + public boolean equals(Object other) { if(other == null || !(other instanceof Application)) { return false; http://git-wip-us.apache.org/repos/asf/stratos/blob/cd66b40a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/ApplicationStatus.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/ApplicationStatus.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/ApplicationStatus.java new file mode 100644 index 0000000..6ca8e27 --- /dev/null +++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/ApplicationStatus.java @@ -0,0 +1,71 @@ +/* + * 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.domain.topology; + +import org.apache.stratos.messaging.domain.topology.lifecycle.LifeCycleState; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +public enum ApplicationStatus implements LifeCycleState { + + Created (0) { + @Override + public Set<LifeCycleState> getNextStates() { + return new HashSet<LifeCycleState>(Arrays.asList(ApplicationStatus.Active, + ApplicationStatus.Terminating)); + } + }, + Active (1) { + @Override + public Set<LifeCycleState> getNextStates() { + return new HashSet<LifeCycleState>(Arrays.asList(ApplicationStatus.Inactive)); + } + }, + Inactive (2) { + @Override + public Set<LifeCycleState> getNextStates() { + return new HashSet<LifeCycleState>(Arrays.asList(ApplicationStatus.Terminating)); + } + }, + Terminating (3) { + @Override + public Set<LifeCycleState> getNextStates() { + return new HashSet<LifeCycleState>(Arrays.asList(ApplicationStatus.Terminated)); + } + }, + Terminated (4) { + @Override + public Set<LifeCycleState> getNextStates() { + return null; + } + }; + + private int code; + + private ApplicationStatus (int code) { + this.code = code; + } + + public int getCode() { + return code; + } +} http://git-wip-us.apache.org/repos/asf/stratos/blob/cd66b40a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java index 31b7bf1..3325561 100644 --- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java +++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java @@ -50,7 +50,7 @@ public class Cluster implements Serializable, LifeCycleStateTransitionBehavior<C @XmlJavaTypeAdapter(MapAdapter.class) private Map<String, Member> memberMap; - //private Status status; + private Status tempStatus; private String appId; @@ -69,6 +69,8 @@ public class Cluster implements Serializable, LifeCycleStateTransitionBehavior<C this.memberMap = new HashMap<String, Member>(); this.appId = appId; this.clusterStateManager = new LifeCycleStateManager<ClusterStatus>(ClusterStatus.Created); + // temporary; should be removed + this.tempStatus = Status.Created; } public String getServiceName() { @@ -250,5 +252,13 @@ public class Cluster implements Serializable, LifeCycleStateTransitionBehavior<C public String getAppId() { return appId; } + + public Status getTempStatus () { + return tempStatus; + } + + public void setTempStatus (Status tempStatus) { + this.tempStatus = tempStatus; + } } http://git-wip-us.apache.org/repos/asf/stratos/blob/cd66b40a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/ClusterStatus.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/ClusterStatus.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/ClusterStatus.java index a9f8afe..8ff5957 100644 --- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/ClusterStatus.java +++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/ClusterStatus.java @@ -26,25 +26,41 @@ import java.util.HashSet; import java.util.Set; public enum ClusterStatus implements LifeCycleState { + Created(0) { @Override public Set<LifeCycleState> getNextStates() { - return new HashSet<LifeCycleState>(Arrays.asList(ClusterStatus.Active)); + return new HashSet<LifeCycleState>(Arrays.asList(ClusterStatus.Active, + ClusterStatus.Terminating)); } }, Active(1) { @Override public Set<LifeCycleState> getNextStates() { - return new HashSet<LifeCycleState>(Arrays.asList(ClusterStatus.Inactive)); + return new HashSet<LifeCycleState>(Arrays.asList(ClusterStatus.Inactive, + ClusterStatus.Patching, ClusterStatus.Terminating)); + } + }, + Patching (2) { + @Override + public Set<LifeCycleState> getNextStates() { + return new HashSet<LifeCycleState>(Arrays.asList(ClusterStatus.Active)); } }, Inactive(3) { @Override public Set<LifeCycleState> getNextStates() { - return new HashSet<LifeCycleState>(Arrays.asList(ClusterStatus.Active, ClusterStatus.Terminated)); + return new HashSet<LifeCycleState>(Arrays.asList(ClusterStatus.Active, + ClusterStatus.Terminating)); + } + }, + Terminating(4) { + @Override + public Set<LifeCycleState> getNextStates() { + return new HashSet<LifeCycleState>(Arrays.asList(ClusterStatus.Terminated)); } }, - Terminated(4) { + Terminated(5) { @Override public Set<LifeCycleState> getNextStates() { return null; http://git-wip-us.apache.org/repos/asf/stratos/blob/cd66b40a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Group.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Group.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Group.java index 9b5a29e..0b64f67 100644 --- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Group.java +++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Group.java @@ -19,11 +19,15 @@ package org.apache.stratos.messaging.domain.topology; +import org.apache.stratos.messaging.domain.topology.lifecycle.LifeCycleStateManager; + +import java.util.Stack; + /** * Represents a Group/nested Group in an Application/Group */ -public class Group extends ParentComponent { +public class Group extends ParentComponent implements LifeCycleStateTransitionBehavior<GroupStatus> { private static final long serialVersionUID = 8347096598203655846L; // Name of the Group, specified in Group Definition @@ -34,11 +38,14 @@ public class Group extends ParentComponent { private String deploymentPolicy; // Group level autoscaling policy private String autoscalingPolicy; + // Life cycle state manager + protected LifeCycleStateManager<GroupStatus> groupStateManager; public Group (String name, String alias) { super(); this.name = name; this.alias = alias; + this.groupStateManager = new LifeCycleStateManager<GroupStatus>(GroupStatus.Created); } public String getUniqueIdentifier() { @@ -65,6 +72,26 @@ public class Group extends ParentComponent { this.autoscalingPolicy = autoscalingPolicy; } + @Override + public boolean isStateTransitionValid(GroupStatus newState) { + return groupStateManager.isStateTransitionValid(newState); + } + + @Override + public Stack<GroupStatus> getTransitionedStates() { + return groupStateManager.getStateStack(); + } + + @Override + public GroupStatus getStatus() { + return groupStateManager.getCurrentState(); + } + + @Override + public void setStatus(GroupStatus newState) { + this.groupStateManager.changeState(newState); + } + public boolean equals(Object other) { if(other == null || !(other instanceof Group)) { return false; @@ -81,5 +108,4 @@ public class Group extends ParentComponent { public int hashCode () { return name.hashCode() + alias.hashCode(); } - } http://git-wip-us.apache.org/repos/asf/stratos/blob/cd66b40a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/GroupStatus.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/GroupStatus.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/GroupStatus.java new file mode 100644 index 0000000..55a7731 --- /dev/null +++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/GroupStatus.java @@ -0,0 +1,70 @@ +/* + * 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.domain.topology; + +import org.apache.stratos.messaging.domain.topology.lifecycle.LifeCycleState; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +public enum GroupStatus implements LifeCycleState { + + Created(0) { + @Override + public Set<LifeCycleState> getNextStates() { + return new HashSet<LifeCycleState>(Arrays.asList(GroupStatus.Active, GroupStatus.Terminating)); + } + }, + Active(1) { + @Override + public Set<LifeCycleState> getNextStates() { + return new HashSet<LifeCycleState>(Arrays.asList(GroupStatus.Inactive, GroupStatus.Terminating)); + } + }, + Inactive(2) { + @Override + public Set<LifeCycleState> getNextStates() { + return new HashSet<LifeCycleState>(Arrays.asList(GroupStatus.Terminating)); + } + }, + Terminating(3) { + @Override + public Set<LifeCycleState> getNextStates() { + return new HashSet<LifeCycleState>(Arrays.asList(GroupStatus.Terminated)); + } + }, + Terminated(4) { + @Override + public Set<LifeCycleState> getNextStates() { + return null; + } + }; + + private int code; + + private GroupStatus(int code) { + this.code = code; + } + + public int getCode() { + return code; + } + +} http://git-wip-us.apache.org/repos/asf/stratos/blob/cd66b40a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Member.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Member.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Member.java index f0cde24..1d80b16 100644 --- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Member.java +++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Member.java @@ -19,7 +19,6 @@ package org.apache.stratos.messaging.domain.topology; -import org.apache.stratos.messaging.domain.topology.lifecycle.LifeCycleState; import org.apache.stratos.messaging.domain.topology.lifecycle.LifeCycleStateManager; import org.apache.stratos.messaging.util.bean.type.map.MapAdapter; @@ -90,7 +89,7 @@ public class Member implements Serializable, LifeCycleStateTransitionBehavior<Me @Override public void setStatus(MemberStatus newState) { - memberStateManager.changeState(newState); + this.memberStateManager.changeState(newState); } public boolean isActive () { http://git-wip-us.apache.org/repos/asf/stratos/blob/cd66b40a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/MemberStatus.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/MemberStatus.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/MemberStatus.java index 6d23c4b..a35766c 100644 --- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/MemberStatus.java +++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/MemberStatus.java @@ -32,38 +32,38 @@ import java.util.Set; @XmlRootElement public enum MemberStatus implements LifeCycleState { - Created(1) { + Created(0) { @Override public Set<LifeCycleState> getNextStates() { return new HashSet<LifeCycleState>(Arrays.asList(MemberStatus.Starting)); } }, - Starting(2) { + Starting(1) { @Override public Set<LifeCycleState> getNextStates() { return new HashSet<LifeCycleState>(Arrays.asList(MemberStatus.Activated)); } }, - Activated(3) { + Activated(2) { @Override public Set<LifeCycleState> getNextStates() { return new HashSet<LifeCycleState>(Arrays.asList(MemberStatus.Suspended, - MemberStatus.In_Maintenance)); + MemberStatus.In_Maintenance, MemberStatus.Starting)); } }, - In_Maintenance(4) { + In_Maintenance(3) { @Override public Set<LifeCycleState> getNextStates() { return new HashSet<LifeCycleState>(Arrays.asList(MemberStatus.ReadyToShutDown)); } }, - ReadyToShutDown(5) { + ReadyToShutDown(4) { @Override public Set<LifeCycleState> getNextStates() { return new HashSet<LifeCycleState>(Arrays.asList(MemberStatus.Terminated)); } }, - Suspended(0) { + Suspended(5) { @Override public Set<LifeCycleState> getNextStates() { return new HashSet<LifeCycleState>(Arrays.asList(MemberStatus.Terminated)); http://git-wip-us.apache.org/repos/asf/stratos/blob/cd66b40a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/ParentComponent.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/ParentComponent.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/ParentComponent.java index 7ce813e..dc5dd20 100644 --- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/ParentComponent.java +++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/ParentComponent.java @@ -36,10 +36,10 @@ public abstract class ParentComponent implements Serializable { // Cluster Id map, key = subscription alias for the cartridge type private Map<String, ClusterDataHolder> aliasToClusterDataMap; // Application status - private Status status; + private Status tempStatus; public ParentComponent () { - this.status = Status.Created; + this.tempStatus = Status.Created; aliasToGroupMap = new HashMap<String, Group>(); aliasToClusterDataMap = new HashMap<String, ClusterDataHolder>(); } @@ -212,11 +212,11 @@ public abstract class ParentComponent implements Serializable { } } - public Status getStatus() { - return status; + public Status getTempStatus() { + return tempStatus; } - public void setStatus(Status status) { - this.status = status; + public void setTempStatus(Status status) { + this.tempStatus = status; } } http://git-wip-us.apache.org/repos/asf/stratos/blob/cd66b40a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/lifecycle/LifeCycleStateManager.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/lifecycle/LifeCycleStateManager.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/lifecycle/LifeCycleStateManager.java index 8131b1d..edb4cb1 100644 --- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/lifecycle/LifeCycleStateManager.java +++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/lifecycle/LifeCycleStateManager.java @@ -33,36 +33,69 @@ public class LifeCycleStateManager<T extends LifeCycleState> implements Serializ private Stack<T> stateStack; public LifeCycleStateManager(T initialState) { + stateStack = new Stack<T>(); stateStack.push(initialState); - //if (log.isDebugEnabled()) { - log.info("Life Cycle State Manager created, initial state: " + initialState.toString()); - //} + log.info("Life Cycle State Manager created, initial state: " + initialState.toString()); } + /** + * checks if any conditions that should be met for the state transfer is valid + * + * @param nextState possible next state for the topology element + * @param topologyEvent relevant ToplogyEvent + * @param <S> subclass of Topology event + * @return + */ public <S extends TopologyEvent> boolean isPreConditionsValid (T nextState, S topologyEvent) { // TODO: implement return true; } + /** + * Checks if the state transition is valid + * + * @param nextState possible next state for the topology element + * @return true if transitioning for nextState from current state is valid, else false + */ public boolean isStateTransitionValid (T nextState) { - return stateStack.peek().getNextStates().contains(nextState); } + /** + * Changes the current state to nextState + * + * @param nextState + */ public void changeState (T nextState) { - stateStack.push(nextState); + log.info("Life Cycle State changed from [ " + getPreviousState() + " ] to [ " + + getCurrentState() + " ]"); } + /** + * Get all the states this element has gone through + * + * @return Stack of states + */ public Stack<T> getStateStack () { return stateStack; } + /** + * Get the current state + * + * @return the current state + */ public T getCurrentState () { return stateStack.peek(); } + /** + * Retrieves the previous state + * + * @return previous state + */ public T getPreviousState () { return stateStack.get(1); } http://git-wip-us.apache.org/repos/asf/stratos/blob/cd66b40a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/util/GroupStatus.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/util/GroupStatus.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/util/GroupStatus.java deleted file mode 100644 index e00d4fa..0000000 --- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/util/GroupStatus.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * 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.domain.topology.util; - -public enum GroupStatus { - - Created(1), - In_Maintenance(2), - terminating(3), - Removed(4), - Running(5), - Active(6); - - private int code; - - private GroupStatus(int code) { - this.code = code; - } - - public int getCode() { - return code; - } - -} http://git-wip-us.apache.org/repos/asf/stratos/blob/cd66b40a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ApplicationActivatedMessageProcessor.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ApplicationActivatedMessageProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ApplicationActivatedMessageProcessor.java index d32cecf..9bcf47d 100644 --- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ApplicationActivatedMessageProcessor.java +++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ApplicationActivatedMessageProcessor.java @@ -88,7 +88,7 @@ public class ApplicationActivatedMessageProcessor extends MessageProcessor { return false; } else { // Apply changes to the topology - application.setStatus(Status.Activated); + application.setTempStatus(Status.Activated); if (log.isInfoEnabled()) { log.info(String.format("Application updated as activated : %s", application.toString())); http://git-wip-us.apache.org/repos/asf/stratos/blob/cd66b40a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterActivatedProcessor.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterActivatedProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterActivatedProcessor.java index 69fc3e7..1a6ffc7 100644 --- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterActivatedProcessor.java +++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterActivatedProcessor.java @@ -119,6 +119,8 @@ public class ClusterActivatedProcessor extends MessageProcessor { log.error("Invalid State Transition from " + cluster.getStatus() + " to " + ClusterStatus.Active); } cluster.setStatus(ClusterStatus.Active); + // temporary; should be removed + cluster.setTempStatus(Status.Activated); if (log.isInfoEnabled()) { log.info(String.format("Cluster updated as activated : %s", cluster.toString())); http://git-wip-us.apache.org/repos/asf/stratos/blob/cd66b40a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterMaintenanceModeMessageProcessor.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterMaintenanceModeMessageProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterMaintenanceModeMessageProcessor.java index 35966e8..096c9a3 100644 --- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterMaintenanceModeMessageProcessor.java +++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterMaintenanceModeMessageProcessor.java @@ -114,6 +114,8 @@ public class ClusterMaintenanceModeMessageProcessor extends MessageProcessor { log.error("Invalid State Transition from " + cluster.getStatus() + " to " + ClusterStatus.Inactive); } cluster.setStatus(ClusterStatus.Inactive); + // temporary; should be removed + cluster.setTempStatus(Status.In_Active); if (log.isInfoEnabled()) { log.info(String.format("Cluster updated as maintenance mode: %s", cluster.toString())); http://git-wip-us.apache.org/repos/asf/stratos/blob/cd66b40a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/GroupActivatedProcessor.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/GroupActivatedProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/GroupActivatedProcessor.java index 5c8de02..1ed6b27 100644 --- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/GroupActivatedProcessor.java +++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/GroupActivatedProcessor.java @@ -90,7 +90,10 @@ public class GroupActivatedProcessor extends MessageProcessor { } } else { // Apply changes to the topology - group.setStatus(Status.Activated); + if (!group.isStateTransitionValid(GroupStatus.Active)) { + log.error("Invalid State Transition from " + application.getTempStatus() + " to " + GroupStatus.Active); + } + group.setTempStatus(Status.Activated); if (log.isInfoEnabled()) { log.info(String.format("Group updated as activated : %s", group.getUniqueIdentifier()));
