Skip to content

Commit 50185b7

Browse files
Damodarkishankavala
authored andcommitted
CLOUDSTACK-7648: There are new VM State Machine changes introduced which were missed to capture the usage events
1 parent b6cacb3 commit 50185b7

14 files changed

Lines changed: 398 additions & 289 deletions

File tree

api/src/com/cloud/vm/VirtualMachine.java

Lines changed: 56 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
// under the License.
1717
package com.cloud.vm;
1818

19+
import java.util.Arrays;
1920
import java.util.Date;
2021
import java.util.Map;
2122

@@ -26,6 +27,8 @@
2627

2728
import com.cloud.hypervisor.Hypervisor.HypervisorType;
2829
import com.cloud.utils.fsm.StateMachine2;
30+
import com.cloud.utils.fsm.StateMachine2.Transition;
31+
import com.cloud.utils.fsm.StateMachine2.Transition.Impact;
2932
import com.cloud.utils.fsm.StateObject;
3033

3134
/**
@@ -75,63 +78,63 @@ public static StateMachine2<State, VirtualMachine.Event, VirtualMachine> getStat
7578

7679
protected static final StateMachine2<State, VirtualMachine.Event, VirtualMachine> s_fsm = new StateMachine2<State, VirtualMachine.Event, VirtualMachine>();
7780
static {
78-
s_fsm.addTransition(State.Stopped, VirtualMachine.Event.StartRequested, State.Starting);
79-
s_fsm.addTransition(State.Stopped, VirtualMachine.Event.DestroyRequested, State.Destroyed);
80-
s_fsm.addTransition(State.Stopped, VirtualMachine.Event.StopRequested, State.Stopped);
81-
s_fsm.addTransition(State.Stopped, VirtualMachine.Event.AgentReportStopped, State.Stopped);
81+
s_fsm.addTransition(new Transition<State, Event>(State.Stopped, VirtualMachine.Event.StartRequested, State.Starting, null));
82+
s_fsm.addTransition(new Transition<State, Event>(State.Stopped, VirtualMachine.Event.DestroyRequested, State.Destroyed, Arrays.asList(new Impact[]{Impact.USAGE})));
83+
s_fsm.addTransition(new Transition<State, Event>(State.Stopped, VirtualMachine.Event.StopRequested, State.Stopped, null));
84+
s_fsm.addTransition(new Transition<State, Event>(State.Stopped, VirtualMachine.Event.AgentReportStopped, State.Stopped, null));
8285

8386
// please pay attention about state transition to Error state, there should be only one case (failed in VM
8487
// creation process)
8588
// that can have such transition
86-
s_fsm.addTransition(State.Stopped, VirtualMachine.Event.OperationFailedToError, State.Error);
87-
88-
s_fsm.addTransition(State.Stopped, VirtualMachine.Event.OperationFailed, State.Stopped);
89-
s_fsm.addTransition(State.Stopped, VirtualMachine.Event.ExpungeOperation, State.Expunging);
90-
s_fsm.addTransition(State.Stopped, VirtualMachine.Event.AgentReportShutdowned, State.Stopped);
91-
s_fsm.addTransition(State.Stopped, VirtualMachine.Event.StorageMigrationRequested, State.Migrating);
92-
s_fsm.addTransition(State.Starting, VirtualMachine.Event.OperationRetry, State.Starting);
93-
s_fsm.addTransition(State.Starting, VirtualMachine.Event.OperationSucceeded, State.Running);
94-
s_fsm.addTransition(State.Starting, VirtualMachine.Event.OperationFailed, State.Stopped);
95-
s_fsm.addTransition(State.Starting, VirtualMachine.Event.AgentReportRunning, State.Running);
96-
s_fsm.addTransition(State.Starting, VirtualMachine.Event.AgentReportStopped, State.Stopped);
97-
s_fsm.addTransition(State.Starting, VirtualMachine.Event.AgentReportShutdowned, State.Stopped);
98-
s_fsm.addTransition(State.Destroyed, VirtualMachine.Event.RecoveryRequested, State.Stopped);
99-
s_fsm.addTransition(State.Destroyed, VirtualMachine.Event.ExpungeOperation, State.Expunging);
100-
s_fsm.addTransition(State.Running, VirtualMachine.Event.MigrationRequested, State.Migrating);
101-
s_fsm.addTransition(State.Running, VirtualMachine.Event.AgentReportRunning, State.Running);
102-
s_fsm.addTransition(State.Running, VirtualMachine.Event.AgentReportStopped, State.Stopped);
103-
s_fsm.addTransition(State.Running, VirtualMachine.Event.StopRequested, State.Stopping);
104-
s_fsm.addTransition(State.Running, VirtualMachine.Event.AgentReportShutdowned, State.Stopped);
105-
s_fsm.addTransition(State.Running, VirtualMachine.Event.AgentReportMigrated, State.Running);
106-
s_fsm.addTransition(State.Running, VirtualMachine.Event.OperationSucceeded, State.Running);
107-
s_fsm.addTransition(State.Migrating, VirtualMachine.Event.MigrationRequested, State.Migrating);
108-
s_fsm.addTransition(State.Migrating, VirtualMachine.Event.OperationSucceeded, State.Running);
109-
s_fsm.addTransition(State.Migrating, VirtualMachine.Event.OperationFailed, State.Running);
110-
s_fsm.addTransition(State.Migrating, VirtualMachine.Event.AgentReportRunning, State.Running);
111-
s_fsm.addTransition(State.Migrating, VirtualMachine.Event.AgentReportStopped, State.Stopped);
112-
s_fsm.addTransition(State.Migrating, VirtualMachine.Event.AgentReportShutdowned, State.Stopped);
113-
s_fsm.addTransition(State.Stopping, VirtualMachine.Event.OperationSucceeded, State.Stopped);
114-
s_fsm.addTransition(State.Stopping, VirtualMachine.Event.OperationFailed, State.Running);
115-
s_fsm.addTransition(State.Stopping, VirtualMachine.Event.AgentReportRunning, State.Running);
116-
s_fsm.addTransition(State.Stopping, VirtualMachine.Event.AgentReportStopped, State.Stopped);
117-
s_fsm.addTransition(State.Stopping, VirtualMachine.Event.StopRequested, State.Stopping);
118-
s_fsm.addTransition(State.Stopping, VirtualMachine.Event.AgentReportShutdowned, State.Stopped);
119-
s_fsm.addTransition(State.Expunging, VirtualMachine.Event.OperationFailed, State.Expunging);
120-
s_fsm.addTransition(State.Expunging, VirtualMachine.Event.ExpungeOperation, State.Expunging);
121-
s_fsm.addTransition(State.Error, VirtualMachine.Event.DestroyRequested, State.Expunging);
122-
s_fsm.addTransition(State.Error, VirtualMachine.Event.ExpungeOperation, State.Expunging);
123-
124-
s_fsm.addTransition(State.Starting, VirtualMachine.Event.FollowAgentPowerOnReport, State.Running);
125-
s_fsm.addTransition(State.Stopping, VirtualMachine.Event.FollowAgentPowerOnReport, State.Running);
126-
s_fsm.addTransition(State.Stopped, VirtualMachine.Event.FollowAgentPowerOnReport, State.Running);
127-
s_fsm.addTransition(State.Running, VirtualMachine.Event.FollowAgentPowerOnReport, State.Running);
128-
s_fsm.addTransition(State.Migrating, VirtualMachine.Event.FollowAgentPowerOnReport, State.Running);
129-
130-
s_fsm.addTransition(State.Starting, VirtualMachine.Event.FollowAgentPowerOffReport, State.Stopped);
131-
s_fsm.addTransition(State.Stopping, VirtualMachine.Event.FollowAgentPowerOffReport, State.Stopped);
132-
s_fsm.addTransition(State.Running, VirtualMachine.Event.FollowAgentPowerOffReport, State.Stopped);
133-
s_fsm.addTransition(State.Migrating, VirtualMachine.Event.FollowAgentPowerOffReport, State.Stopped);
134-
s_fsm.addTransition(State.Stopped, VirtualMachine.Event.FollowAgentPowerOffReport, State.Stopped);
89+
s_fsm.addTransition(new Transition<State, Event>(State.Stopped, VirtualMachine.Event.OperationFailedToError, State.Error, Arrays.asList(new Impact[]{Impact.USAGE})));
90+
91+
s_fsm.addTransition(new Transition<State, Event>(State.Stopped, VirtualMachine.Event.OperationFailed, State.Stopped, null));
92+
s_fsm.addTransition(new Transition<State, Event>(State.Stopped, VirtualMachine.Event.ExpungeOperation, State.Expunging, Arrays.asList(new Impact[]{Impact.USAGE})));
93+
s_fsm.addTransition(new Transition<State, Event>(State.Stopped, VirtualMachine.Event.AgentReportShutdowned, State.Stopped, null));
94+
s_fsm.addTransition(new Transition<State, Event>(State.Stopped, VirtualMachine.Event.StorageMigrationRequested, State.Migrating, null));
95+
s_fsm.addTransition(new Transition<State, Event>(State.Starting, VirtualMachine.Event.OperationRetry, State.Starting, null));
96+
s_fsm.addTransition(new Transition<State, Event>(State.Starting, VirtualMachine.Event.OperationSucceeded, State.Running, Arrays.asList(new Impact[]{Impact.USAGE})));
97+
s_fsm.addTransition(new Transition<State, Event>(State.Starting, VirtualMachine.Event.OperationFailed, State.Stopped, null));
98+
s_fsm.addTransition(new Transition<State, Event>(State.Starting, VirtualMachine.Event.AgentReportRunning, State.Running, Arrays.asList(new Impact[]{Impact.USAGE})));
99+
s_fsm.addTransition(new Transition<State, Event>(State.Starting, VirtualMachine.Event.AgentReportStopped, State.Stopped, null));
100+
s_fsm.addTransition(new Transition<State, Event>(State.Starting, VirtualMachine.Event.AgentReportShutdowned, State.Stopped, null));
101+
s_fsm.addTransition(new Transition<State, Event>(State.Destroyed, VirtualMachine.Event.RecoveryRequested, State.Stopped, null));
102+
s_fsm.addTransition(new Transition<State, Event>(State.Destroyed, VirtualMachine.Event.ExpungeOperation, State.Expunging, null));
103+
s_fsm.addTransition(new Transition<State, Event>(State.Running, VirtualMachine.Event.MigrationRequested, State.Migrating, null));
104+
s_fsm.addTransition(new Transition<State, Event>(State.Running, VirtualMachine.Event.AgentReportRunning, State.Running, null));
105+
s_fsm.addTransition(new Transition<State, Event>(State.Running, VirtualMachine.Event.AgentReportStopped, State.Stopped, Arrays.asList(new Impact[]{Impact.USAGE})));
106+
s_fsm.addTransition(new Transition<State, Event>(State.Running, VirtualMachine.Event.StopRequested, State.Stopping, null));
107+
s_fsm.addTransition(new Transition<State, Event>(State.Running, VirtualMachine.Event.AgentReportShutdowned, State.Stopped, Arrays.asList(new Impact[]{Impact.USAGE})));
108+
s_fsm.addTransition(new Transition<State, Event>(State.Running, VirtualMachine.Event.AgentReportMigrated, State.Running, null));
109+
s_fsm.addTransition(new Transition<State, Event>(State.Running, VirtualMachine.Event.OperationSucceeded, State.Running, null));
110+
s_fsm.addTransition(new Transition<State, Event>(State.Migrating, VirtualMachine.Event.MigrationRequested, State.Migrating, null));
111+
s_fsm.addTransition(new Transition<State, Event>(State.Migrating, VirtualMachine.Event.OperationSucceeded, State.Running, null));
112+
s_fsm.addTransition(new Transition<State, Event>(State.Migrating, VirtualMachine.Event.OperationFailed, State.Running, null));
113+
s_fsm.addTransition(new Transition<State, Event>(State.Migrating, VirtualMachine.Event.AgentReportRunning, State.Running, null));
114+
s_fsm.addTransition(new Transition<State, Event>(State.Migrating, VirtualMachine.Event.AgentReportStopped, State.Stopped, null));
115+
s_fsm.addTransition(new Transition<State, Event>(State.Migrating, VirtualMachine.Event.AgentReportShutdowned, State.Stopped, null));
116+
s_fsm.addTransition(new Transition<State, Event>(State.Stopping, VirtualMachine.Event.OperationSucceeded, State.Stopped, Arrays.asList(new Impact[]{Impact.USAGE})));
117+
s_fsm.addTransition(new Transition<State, Event>(State.Stopping, VirtualMachine.Event.OperationFailed, State.Running, null));
118+
s_fsm.addTransition(new Transition<State, Event>(State.Stopping, VirtualMachine.Event.AgentReportRunning, State.Running, null));
119+
s_fsm.addTransition(new Transition<State, Event>(State.Stopping, VirtualMachine.Event.AgentReportStopped, State.Stopped, Arrays.asList(new Impact[]{Impact.USAGE})));
120+
s_fsm.addTransition(new Transition<State, Event>(State.Stopping, VirtualMachine.Event.StopRequested, State.Stopping, null));
121+
s_fsm.addTransition(new Transition<State, Event>(State.Stopping, VirtualMachine.Event.AgentReportShutdowned, State.Stopped, Arrays.asList(new Impact[]{Impact.USAGE})));
122+
s_fsm.addTransition(new Transition<State, Event>(State.Expunging, VirtualMachine.Event.OperationFailed, State.Expunging,null));
123+
s_fsm.addTransition(new Transition<State, Event>(State.Expunging, VirtualMachine.Event.ExpungeOperation, State.Expunging,null));
124+
s_fsm.addTransition(new Transition<State, Event>(State.Error, VirtualMachine.Event.DestroyRequested, State.Expunging, null));
125+
s_fsm.addTransition(new Transition<State, Event>(State.Error, VirtualMachine.Event.ExpungeOperation, State.Expunging, null));
126+
127+
s_fsm.addTransition(new Transition<State, Event>(State.Starting, VirtualMachine.Event.FollowAgentPowerOnReport, State.Running, Arrays.asList(new Impact[]{Impact.USAGE})));
128+
s_fsm.addTransition(new Transition<State, Event>(State.Stopping, VirtualMachine.Event.FollowAgentPowerOnReport, State.Running, null));
129+
s_fsm.addTransition(new Transition<State, Event>(State.Stopped, VirtualMachine.Event.FollowAgentPowerOnReport, State.Running, Arrays.asList(new Impact[]{Impact.USAGE})));
130+
s_fsm.addTransition(new Transition<State, Event>(State.Running, VirtualMachine.Event.FollowAgentPowerOnReport, State.Running, null));
131+
s_fsm.addTransition(new Transition<State, Event>(State.Migrating, VirtualMachine.Event.FollowAgentPowerOnReport, State.Running, null));
132+
133+
s_fsm.addTransition(new Transition<State, Event>(State.Starting, VirtualMachine.Event.FollowAgentPowerOffReport, State.Stopped, null));
134+
s_fsm.addTransition(new Transition<State, Event>(State.Stopping, VirtualMachine.Event.FollowAgentPowerOffReport, State.Stopped, Arrays.asList(new Impact[]{Impact.USAGE})));
135+
s_fsm.addTransition(new Transition<State, Event>(State.Running, VirtualMachine.Event.FollowAgentPowerOffReport, State.Stopped, Arrays.asList(new Impact[]{Impact.USAGE})));
136+
s_fsm.addTransition(new Transition<State, Event>(State.Migrating, VirtualMachine.Event.FollowAgentPowerOffReport, State.Stopped, null));
137+
s_fsm.addTransition(new Transition<State, Event>(State.Stopped, VirtualMachine.Event.FollowAgentPowerOffReport, State.Stopped, null));
135138
}
136139

137140
public static boolean isVmStarted(State oldState, Event e, State newState) {

engine/components-api/src/com/cloud/network/NetworkStateListener.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
import javax.inject.Inject;
2626

27+
import com.cloud.utils.fsm.StateMachine2;
2728
import org.apache.log4j.Logger;
2829
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
2930

@@ -65,12 +66,15 @@ public boolean preStateTransitionEvent(State oldState, Event event, State newSta
6566
}
6667

6768
@Override
68-
public boolean postStateTransitionEvent(State oldState, Event event, State newState, Network vo, boolean status, Object opaque) {
69-
pubishOnEventBus(event.name(), "postStateTransitionEvent", vo, oldState, newState);
70-
return true;
69+
public boolean postStateTransitionEvent(StateMachine2.Transition<State, Event> transition, Network vo, boolean status, Object opaque) {
70+
State oldState = transition.getCurrentState();
71+
State newState = transition.getToState();
72+
Event event = transition.getEvent();
73+
pubishOnEventBus(event.name(), "postStateTransitionEvent", vo, oldState, newState);
74+
return true;
7175
}
7276

73-
private void pubishOnEventBus(String event, String status, Network vo, State oldState, State newState) {
77+
private void pubishOnEventBus(String event, String status, Network vo, State oldState, State newState) {
7478

7579
String configKey = "publish.resource.state.events";
7680
String value = _configDao.getValue(configKey);

plugins/hypervisors/baremetal/src/com/cloud/baremetal/manager/BaremetalManagerImpl.java

Lines changed: 28 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import com.cloud.utils.db.QueryBuilder;
3030
import com.cloud.utils.db.SearchCriteria;
3131
import com.cloud.utils.exception.CloudRuntimeException;
32+
import com.cloud.utils.fsm.StateMachine2;
3233
import com.cloud.vm.VMInstanceVO;
3334
import com.cloud.vm.dao.VMInstanceDao;
3435
import org.apache.cloudstack.api.BaremetalProvisionDoneNotificationCmd;
@@ -81,37 +82,39 @@ public boolean preStateTransitionEvent(State oldState, Event event, State newSta
8182
}
8283

8384
@Override
84-
public boolean postStateTransitionEvent(State oldState, Event event, State newState, VirtualMachine vo, boolean status, Object opaque) {
85-
if (newState != State.Starting && newState != State.Error && newState != State.Expunging) {
86-
return true;
87-
}
88-
89-
if (vo.getHypervisorType() != HypervisorType.BareMetal) {
90-
return true;
91-
}
85+
public boolean postStateTransitionEvent(StateMachine2.Transition<State, Event> transition, VirtualMachine vo, boolean status, Object opaque) {
86+
State newState = transition.getToState();
87+
State oldState = transition.getCurrentState();
88+
if (newState != State.Starting && newState != State.Error && newState != State.Expunging) {
89+
return true;
90+
}
9291

93-
HostVO host = _hostDao.findById(vo.getHostId());
94-
if (host == null) {
95-
s_logger.debug("Skip oldState " + oldState + " to " + "newState " + newState + " transimtion");
96-
return true;
97-
}
98-
_hostDao.loadDetails(host);
92+
if (vo.getHypervisorType() != HypervisorType.BareMetal) {
93+
return true;
94+
}
9995

100-
if (newState == State.Starting) {
101-
host.setDetail("vmName", vo.getInstanceName());
102-
s_logger.debug("Add vmName " + host.getDetail("vmName") + " to host " + host.getId() + " details");
103-
} else {
104-
if (host.getDetail("vmName") != null && host.getDetail("vmName").equalsIgnoreCase(vo.getInstanceName())) {
105-
s_logger.debug("Remove vmName " + host.getDetail("vmName") + " from host " + host.getId() + " details");
106-
host.getDetails().remove("vmName");
107-
}
96+
HostVO host = _hostDao.findById(vo.getHostId());
97+
if (host == null) {
98+
s_logger.debug("Skip oldState " + oldState + " to " + "newState " + newState + " transimtion");
99+
return true;
100+
}
101+
_hostDao.loadDetails(host);
102+
103+
if (newState == State.Starting) {
104+
host.setDetail("vmName", vo.getInstanceName());
105+
s_logger.debug("Add vmName " + host.getDetail("vmName") + " to host " + host.getId() + " details");
106+
} else {
107+
if (host.getDetail("vmName") != null && host.getDetail("vmName").equalsIgnoreCase(vo.getInstanceName())) {
108+
s_logger.debug("Remove vmName " + host.getDetail("vmName") + " from host " + host.getId() + " details");
109+
host.getDetails().remove("vmName");
108110
}
109-
_hostDao.saveDetails(host);
111+
}
112+
_hostDao.saveDetails(host);
110113

111-
return true;
114+
return true;
112115
}
113116

114-
@Override
117+
@Override
115118
public List<Class<?>> getCommands() {
116119
List<Class<?>> cmds = new ArrayList<Class<?>>();
117120
cmds.add(AddBaremetalHostCmd.class);

0 commit comments

Comments
 (0)