/*_##########################################################################
_##
_## Copyright (C) 2012-2013 Kaito Yamada
_##
_##########################################################################
*/
package com.github.kaitoy.sneo.giane.action;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.InterceptorRef;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.interceptor.validation.SkipValidation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.github.kaitoy.sneo.giane.action.message.FormMessage;
import com.github.kaitoy.sneo.giane.action.message.SimulationMessage;
import com.github.kaitoy.sneo.giane.model.AdditionalIpV4Route;
import com.github.kaitoy.sneo.giane.model.AdditionalIpV4RouteGroup;
import com.github.kaitoy.sneo.giane.model.AdditionalIpV6Route;
import com.github.kaitoy.sneo.giane.model.AdditionalIpV6RouteGroup;
import com.github.kaitoy.sneo.giane.model.RealNetworkInterfaceConfiguration;
import com.github.kaitoy.sneo.giane.model.Simulation;
import com.github.kaitoy.sneo.giane.model.TrapTargetGroup;
import com.github.kaitoy.sneo.giane.model.dao.SimulationDao;
import com.github.kaitoy.sneo.giane.servletlistener.JmxAgentStarter;
import com.github.kaitoy.sneo.jmx.JmxAgent;
import com.github.kaitoy.sneo.network.Network;
import com.github.kaitoy.sneo.network.dto.NetworkDto;
import com.github.kaitoy.sneo.network.dto.NodeDto;
import com.github.kaitoy.sneo.network.dto.RealNetworkInterfaceDto;
import com.github.kaitoy.sneo.network.dto.SnmpAgentDto;
import com.opensymphony.xwork2.ActionSupport;
@ParentPackage("giane-default")
@InterceptorRef("gianeDefaultStack")
public class StartSimulatorAction extends ActionSupport
implements SimulationMessage, FormMessage {
/**
*
*/
private static final long serialVersionUID = -6369033199702364281L;
private static final Logger logger
= LoggerFactory.getLogger(StartSimulatorAction.class);
private static final Map<Integer, Network> runningNetworks
= new ConcurrentHashMap<Integer, Network>();
private Integer simulationId;
private SimulationDao simulationDao;
private String dialogTitleKey;
private String dialogTextKey;
static Map<Integer, Network> getRunningNetworks() {
return runningNetworks;
}
public void setSimulationId(Integer simulationId) {
this.simulationId = simulationId;
}
// for DI
public void setSimulationDao(
SimulationDao simulationDao
) {
this.simulationDao = simulationDao;
}
public String getDialogTitleKey() {
return dialogTitleKey;
}
public String getDialogTextKey() {
return dialogTextKey;
}
@Override
@Action(
results = {
@Result(name = "success", location = "dialog.jsp"),
@Result(name = "noNeed", location = "dialog.jsp"),
@Result(name = "selectARow", location = "dialog.jsp"),
@Result(name = "error", location = "dialog.jsp")
}
)
@SkipValidation
public String execute() throws Exception {
if (simulationId == null) {
dialogTitleKey = "simulation.selectARow.dialog.title";
dialogTextKey = "simulation.selectARow.dialog.text";
return "selectARow";
}
synchronized (runningNetworks) {
if (runningNetworks.containsKey(simulationId)) {
dialogTitleKey = "simulation.start.noNeed.dialog.title";
dialogTextKey = "simulation.start.noNeed.dialog.text";
return "noNeed";
}
try {
Simulation simulation = simulationDao.findByKey(simulationId);
NetworkDto networkDto = simulation.getNetwork().toDto();
for (NodeDto nodeDto: networkDto.getNodes()) {
SnmpAgentDto agentDto = nodeDto.getAgent();
if (agentDto != null) {
TrapTargetGroup ttg = simulation.getTrapTargetGroup(agentDto.getId());
if (ttg != null) {
agentDto.setTrapTargetGroup(ttg.toDto());
}
}
AdditionalIpV4RouteGroup v4Routeg = simulation.getAdditionalIpV4RouteGroup(nodeDto.getId());
if (v4Routeg != null) {
for (AdditionalIpV4Route route: v4Routeg.getAdditionalIpV4Routes()) {
nodeDto.getIpV4Routes().add(route.toDto());
}
}
AdditionalIpV6RouteGroup v6routeg = simulation.getAdditionalIpV6RouteGroup(nodeDto.getId());
if (v6routeg != null) {
for (AdditionalIpV6Route route: v6routeg.getAdditionalIpV6Routes()) {
nodeDto.getIpV6Routes().add(route.toDto());
}
}
for (RealNetworkInterfaceDto rnifDto: nodeDto.getRealNetworkInterfaces()) {
RealNetworkInterfaceConfiguration rnifConf
= simulation.getRealNetworkInterfaceConfiguration(rnifDto.getId());
if (rnifConf != null) {
rnifDto.setDeviceName(rnifConf.getDeviceName());
rnifDto.setMacAddress(rnifConf.getMacAddress());
rnifDto.setIpAddresses(
rnifConf.getIpAddressRelation().getIpAddressDtos()
);
}
}
}
Network network = new Network(networkDto);
JmxAgent jmxAgent = JmxAgentStarter.getJmxAgent();
network.start(simulation.getName(), jmxAgent);
runningNetworks.put(simulationId, network);
dialogTitleKey = "simulation.start.success.dialog.title";
dialogTextKey = "simulation.start.success.dialog.text";
return "success";
} catch (Exception e) {
logger.error("An error occurred during starting simulator: ", e);
dialogTitleKey = "simulation.start.error.dialog.title";
dialogTextKey = "simulation.start.error.dialog.text";
return "error";
}
}
}
@Action(
value = "stop-simulator",
results = {
@Result(name = "success", location = "dialog.jsp"),
@Result(name = "noNeed", location = "dialog.jsp"),
@Result(name = "selectARow", location = "dialog.jsp"),
@Result(name = "error", location = "dialog.jsp")
}
)
@SkipValidation
public String stop() throws Exception {
if (simulationId == null) {
dialogTitleKey = "simulation.selectARow.dialog.title";
dialogTextKey = "simulation.selectARow.dialog.text";
return "selectARow";
}
synchronized (runningNetworks) {
if (!runningNetworks.containsKey(simulationId)) {
dialogTitleKey = "simulation.stop.noNeed.dialog.title";
dialogTextKey = "simulation.stop.noNeed.dialog.text";
return "noNeed";
}
try {
Network network = runningNetworks.get(simulationId);
Simulation simulation = simulationDao.findByKey(simulationId);
JmxAgent jmxAgent = JmxAgentStarter.getJmxAgent();
network.stop(simulation.getName(), jmxAgent);
runningNetworks.remove(simulationId);
dialogTitleKey = "simulation.stop.success.dialog.title";
dialogTextKey = "simulation.stop.success.dialog.text";
return "success";
} catch (Exception e) {
logger.error("An error occurred during stopping simulator: ", e);
dialogTitleKey = "simulation.stop.error.dialog.title";
dialogTextKey = "simulation.stop.error.dialog.text";
return "error";
}
}
}
@Action(
value = "start-simulator-tab-content",
results = {
@Result(name = "tab", location = "start-simulator-tab-content.jsp")
}
)
@SkipValidation
public String startTab() throws Exception {
return "tab";
}
}