Skip to content

Commit ee2adab

Browse files
committed
reboot VR if a out-of-band power-on event is detected
1 parent fed8581 commit ee2adab

1 file changed

Lines changed: 41 additions & 4 deletions

File tree

server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,7 @@
251251
import com.cloud.utils.db.TransactionCallbackNoReturn;
252252
import com.cloud.utils.db.TransactionStatus;
253253
import com.cloud.utils.exception.CloudRuntimeException;
254+
import com.cloud.utils.fsm.StateListener;
254255
import com.cloud.utils.net.Ip;
255256
import com.cloud.utils.net.MacAddress;
256257
import com.cloud.utils.net.NetUtils;
@@ -281,9 +282,9 @@
281282
/**
282283
* VirtualNetworkApplianceManagerImpl manages the different types of virtual network appliances available in the Cloud Stack.
283284
*/
284-
@Local(value = {VirtualNetworkApplianceManager.class, VirtualNetworkApplianceService.class})
285-
public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements VirtualNetworkApplianceManager, VirtualNetworkApplianceService, VirtualMachineGuru,
286-
Listener, Configurable {
285+
@Local(value = { VirtualNetworkApplianceManager.class, VirtualNetworkApplianceService.class })
286+
public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements VirtualNetworkApplianceManager, VirtualNetworkApplianceService,
287+
VirtualMachineGuru, Listener, Configurable, StateListener<State, VirtualMachine.Event, VirtualMachine> {
287288
private static final Logger s_logger = Logger.getLogger(VirtualNetworkApplianceManagerImpl.class);
288289

289290
@Inject
@@ -675,6 +676,8 @@ public boolean configure(final String name, final Map<String, Object> params) th
675676
_checkExecutor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("RouterStatusMonitor"));
676677
_networkStatsUpdateExecutor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("NetworkStatsUpdater"));
677678

679+
VirtualMachine.State.getStateMachine().registerListener(this);
680+
678681
final Map<String, String> configs = _configDao.getConfiguration("AgentManager", params);
679682

680683
_routerRamSize = NumbersUtil.parseInt(configs.get("router.ram.size"), DEFAULT_ROUTER_VM_RAMSIZE);
@@ -3435,7 +3438,6 @@ private void createVmDataCommand(final VirtualRouter router, final UserVm vm, fi
34353438
"vmdata",
34363439
generateVmDataCommand(router, nic.getIp4Address(), vm.getUserData(), serviceOffering, zoneName, nic.getIp4Address(), vm.getHostName(), vm.getInstanceName(),
34373440
vm.getId(), vm.getUuid(), publicKey, nic.getNetworkId()));
3438-
34393441
}
34403442

34413443
private void createVmDataCommandForVMs(final DomainRouterVO router, final Commands cmds, final long guestNetworkId) {
@@ -4228,4 +4230,39 @@ public String getConfigComponentName() {
42284230
public ConfigKey<?>[] getConfigKeys() {
42294231
return new ConfigKey<?>[] {UseExternalDnsServers, routerVersionCheckEnabled, SetServiceMonitor};
42304232
}
4233+
4234+
@Override
4235+
public boolean preStateTransitionEvent(State oldState, VirtualMachine.Event event, State newState, VirtualMachine vo, boolean status, Object opaque) {
4236+
return true;
4237+
}
4238+
4239+
@Override
4240+
public boolean postStateTransitionEvent(State oldState, VirtualMachine.Event event, State newState, VirtualMachine vo, boolean status, Object opaque) {
4241+
if (oldState == State.Stopped && event == VirtualMachine.Event.FollowAgentPowerOnReport && newState == State.Running) {
4242+
if (vo.getType() == VirtualMachine.Type.DomainRouter) {
4243+
s_logger.info("Schedule a router reboot task as router " + vo.getId() + " is powered-on out-of-band. we need to reboot to refresh network rules");
4244+
_executor.schedule(new RebootTask(vo.getId()), 1000, TimeUnit.MICROSECONDS);
4245+
}
4246+
}
4247+
return true;
4248+
}
4249+
4250+
protected class RebootTask extends ManagedContextRunnable {
4251+
4252+
long _routerId;
4253+
4254+
public RebootTask(long routerId) {
4255+
_routerId = routerId;
4256+
}
4257+
4258+
@Override
4259+
protected void runInContext() {
4260+
try {
4261+
s_logger.info("Reboot router " + _routerId + " to refresh network rules");
4262+
rebootRouter(_routerId, true);
4263+
} catch (Exception e) {
4264+
s_logger.warn("Error while rebooting the router", e);
4265+
}
4266+
}
4267+
}
42314268
}

0 commit comments

Comments
 (0)