fullfil the ScriptLoadCommand, and we can rollback it now
This commit is contained in:
parent
dbe83ffd58
commit
57d9329dd9
|
@ -21,7 +21,6 @@ import org.springframework.stereotype.Component;
|
|||
|
||||
@Component
|
||||
public class ScriptService {
|
||||
|
||||
private SessionHelper sessionHelper = new SessionHelper();
|
||||
private UserService userService;
|
||||
|
||||
|
|
|
@ -1,49 +1,37 @@
|
|||
package org.bench4q.master.testPlan;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.StringWriter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
import javax.xml.bind.JAXBContext;
|
||||
import javax.xml.bind.JAXBException;
|
||||
import javax.xml.bind.Marshaller;
|
||||
|
||||
import org.apache.log4j.Logger;
|
||||
import org.bench4q.master.api.model.RunningAgentModel;
|
||||
import org.bench4q.master.api.model.RunningScriptModel;
|
||||
import org.bench4q.master.communication.HttpRequester;
|
||||
import org.bench4q.master.communication.agent.RunScenarioModel;
|
||||
import org.bench4q.master.communication.agent.RunScenarioResultModel;
|
||||
import org.bench4q.master.entity.db.Agent;
|
||||
import org.bench4q.master.service.AgentService;
|
||||
import org.bench4q.master.service.ScriptService;
|
||||
import org.bench4q.master.testPlan.highavailable.HighAvailableAgentPool;
|
||||
import org.bench4q.master.testPlan.loadcommand.LoadCommand;
|
||||
import org.bench4q.master.testPlan.loadcommand.ScriptLoadCommand;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Component
|
||||
public class LoadBallancer {
|
||||
|
||||
private ScriptService scriptService;
|
||||
private AgentService agentService;
|
||||
// private ScriptService scriptService;
|
||||
// private AgentService agentService;
|
||||
private HighAvailableAgentPool highAvailableAgentPool;
|
||||
private static Logger logger = Logger.getLogger(LoadBallancer.class);
|
||||
|
||||
@Autowired
|
||||
public void setScriptService(ScriptService scriptService) {
|
||||
this.scriptService = scriptService;
|
||||
}
|
||||
// @Autowired
|
||||
// public void setScriptService(ScriptService scriptService) {
|
||||
// this.scriptService = scriptService;
|
||||
// }
|
||||
|
||||
private AgentService getAgentService() {
|
||||
return agentService;
|
||||
}
|
||||
|
||||
@Autowired
|
||||
public void setAgentService(AgentService agentService) {
|
||||
this.agentService = agentService;
|
||||
}
|
||||
// private AgentService getAgentService() {
|
||||
// return agentService;
|
||||
// }
|
||||
//
|
||||
// @Autowired
|
||||
// public void setAgentService(AgentService agentService) {
|
||||
// this.agentService = agentService;
|
||||
// }
|
||||
|
||||
@Autowired
|
||||
public void setHttpRequester(HttpRequester httpRequester) {
|
||||
|
@ -68,15 +56,24 @@ public class LoadBallancer {
|
|||
}
|
||||
for (RunningScriptModel scriptInputModel : testPlanContext
|
||||
.getRunningScriptMap().values()) {
|
||||
RunningScriptModel sOutputModel = this.generateLoadForScript(
|
||||
// RunningScriptModel sOutputModel = this.generateLoadForScript(
|
||||
// scriptInputModel, testPlanId);
|
||||
// if (sOutputModel == null) {
|
||||
// logger.error("generateLoadForScriptFails where scriptInputModel is null and script num is :"
|
||||
// + testPlanContext.getRunningScriptMap().size());
|
||||
// return false;
|
||||
// }
|
||||
// testPlanContext.addToScriptMap(sOutputModel.getScriptId(),
|
||||
// sOutputModel);
|
||||
LoadCommand scriptLoadCommand = new ScriptLoadCommand(
|
||||
scriptInputModel, testPlanId);
|
||||
RunningScriptModel sOutputModel = (RunningScriptModel) scriptLoadCommand
|
||||
.distributeLoad();
|
||||
if (sOutputModel == null) {
|
||||
logger.error("generateLoadForScriptFails where scriptInputModel is null and script num is :"
|
||||
+ testPlanContext.getRunningScriptMap().size());
|
||||
scriptLoadCommand.retieveLoad();
|
||||
return false;
|
||||
}
|
||||
testPlanContext.addToScriptMap(sOutputModel.getScriptId(),
|
||||
sOutputModel);
|
||||
testPlanContext.addToScriptMap(sOutputModel);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -87,157 +84,159 @@ public class LoadBallancer {
|
|||
.getTotalLoad();
|
||||
}
|
||||
|
||||
private RunningScriptModel generateLoadForScript(
|
||||
RunningScriptModel scriptInputModel, UUID testPlanId) {
|
||||
RunScenarioModel runScenarioModel = this.scriptService
|
||||
.getRunSceniroModelByScriptId(scriptInputModel.getScriptId());
|
||||
if (runScenarioModel == null) {
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
RunningScriptModel result = this.runAgentsWithScenario(
|
||||
runScenarioModel, scriptInputModel.getRequireLoad(),
|
||||
scriptInputModel.getScriptId(), testPlanId);
|
||||
// private RunningScriptModel generateLoadForScript(
|
||||
// RunningScriptModel scriptInputModel, UUID testPlanId) {
|
||||
// RunScenarioModel runScenarioModel = this.scriptService
|
||||
// .getRunSceniroModelByScriptId(scriptInputModel.getScriptId());
|
||||
// if (runScenarioModel == null) {
|
||||
// return null;
|
||||
// }
|
||||
// try {
|
||||
// RunningScriptModel result = this.runAgentsWithScenario(
|
||||
// runScenarioModel, scriptInputModel.getRequireLoad(),
|
||||
// scriptInputModel.getScriptId(), testPlanId);
|
||||
//
|
||||
// if (result.getRunningAgents() == null) {
|
||||
// // this means that allocation for this script fails
|
||||
// // TODO: sign the script's failure in response.
|
||||
// logger.error("runAgentsWithScenario fails where scriptId = "
|
||||
// + result.getScriptId());
|
||||
// return null;
|
||||
// }
|
||||
// result.setRequireLoad(scriptInputModel.getRequireLoad());
|
||||
// result.setConfig(scriptInputModel.getConfig());
|
||||
// return result;
|
||||
// } catch (JAXBException e) {
|
||||
// e.printStackTrace();
|
||||
// return null;
|
||||
// }
|
||||
// }
|
||||
|
||||
if (result.getRunningAgents() == null) {
|
||||
// this means that allocation for this script fails
|
||||
// TODO: sign the script's failure in response.
|
||||
logger.error("runAgentsWithScenario fails where scriptId = "
|
||||
+ result.getScriptId());
|
||||
return null;
|
||||
}
|
||||
// private RunningScriptModel runAgentsWithScenario(
|
||||
// RunScenarioModel runScenarioModel, int totalRequireLoad,
|
||||
// int scriptId, UUID testPlanId) throws JAXBException {
|
||||
// RunningAgentModel runningAgentModel = new RunningAgentModel();
|
||||
// RunScenarioResultModel runScenarioResultModel = new
|
||||
// RunScenarioResultModel();
|
||||
// List<RunningAgentModel> runningAgentModelList = new
|
||||
// ArrayList<RunningAgentModel>();
|
||||
// int loadForRunCurrent;
|
||||
//
|
||||
// for (Agent agent : this.getHighAvailableAgentPool()
|
||||
// .getHighAvailablePool()) {
|
||||
// if (allocationFinish(totalRequireLoad)) {
|
||||
// break;
|
||||
// }
|
||||
// if (this.highAvailableAgentPool.queryAgentStatus(agent) == null
|
||||
// || inUse(agent)) {
|
||||
// continue;
|
||||
// }
|
||||
// loadForRunCurrent = getMin(totalRequireLoad, agent.getRemainLoad());
|
||||
// runScenarioModel.setPoolSize(loadForRunCurrent);
|
||||
// runScenarioModel.setTotalCount(loadForRunCurrent);
|
||||
// runScenarioResultModel = runAgentWithScenario(runScenarioModel,
|
||||
// agent);
|
||||
// if (runScenarioResultModel == null) {
|
||||
// continue;
|
||||
// }
|
||||
// runningAgentModel = buildRunningAgentModel(agent,
|
||||
// loadForRunCurrent, scriptId,
|
||||
// runScenarioResultModel.getRunId());
|
||||
// runningAgentModelList.add(runningAgentModel);
|
||||
//
|
||||
// this.highAvailableAgentPool.getAgentRunBlotters().put(
|
||||
// runScenarioResultModel.getRunId(),
|
||||
// buildAgentRunBlotter(runningAgentModel, testPlanId));
|
||||
// totalRequireLoad -= loadForRunCurrent;
|
||||
// }
|
||||
//
|
||||
// if (!allocationFinish(totalRequireLoad)) {
|
||||
// logger.error("allocationUnfinished, remain " + totalRequireLoad
|
||||
// + " unallocated");
|
||||
// runningAgentModelList =
|
||||
// rollbackForUnfinishedAllocation(runningAgentModelList);
|
||||
// }
|
||||
// return buildRunningScriptModel(runningAgentModelList, scriptId);
|
||||
// }
|
||||
|
||||
result.setRequireLoad(scriptInputModel.getRequireLoad());
|
||||
result.setConfig(scriptInputModel.getConfig());
|
||||
return result;
|
||||
} catch (JAXBException e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
// private List<RunningAgentModel> rollbackForUnfinishedAllocation(
|
||||
// List<RunningAgentModel> runningAgentModelList) {
|
||||
// stopAgentsRunningThisScript(runningAgentModelList);
|
||||
// runningAgentModelList = null;
|
||||
// return runningAgentModelList;
|
||||
// }
|
||||
|
||||
private RunningScriptModel runAgentsWithScenario(
|
||||
RunScenarioModel runScenarioModel, int totalRequireLoad,
|
||||
int scriptId, UUID testPlanId) throws JAXBException {
|
||||
RunningAgentModel runningAgentModel = new RunningAgentModel();
|
||||
RunScenarioResultModel runScenarioResultModel = new RunScenarioResultModel();
|
||||
List<RunningAgentModel> runningAgentModelList = new ArrayList<RunningAgentModel>();
|
||||
int loadForRunCurrent;
|
||||
// private boolean allocationFinish(int requireLoad) {
|
||||
// return requireLoad <= 0;
|
||||
// }
|
||||
|
||||
for (Agent agent : this.getHighAvailableAgentPool()
|
||||
.getHighAvailablePool()) {
|
||||
if (allocationFinish(totalRequireLoad)) {
|
||||
break;
|
||||
}
|
||||
if (this.highAvailableAgentPool.queryAgentStatus(agent) == null
|
||||
|| inUse(agent)) {
|
||||
continue;
|
||||
}
|
||||
loadForRunCurrent = getMin(totalRequireLoad, agent.getRemainLoad());
|
||||
runScenarioModel.setPoolSize(loadForRunCurrent);
|
||||
runScenarioModel.setTotalCount(loadForRunCurrent);
|
||||
runScenarioResultModel = runAgentWithScenario(runScenarioModel,
|
||||
agent);
|
||||
if (runScenarioResultModel == null) {
|
||||
continue;
|
||||
}
|
||||
runningAgentModel = buildRunningAgentModel(agent,
|
||||
loadForRunCurrent, scriptId,
|
||||
runScenarioResultModel.getRunId());
|
||||
runningAgentModelList.add(runningAgentModel);
|
||||
// private void stopAgentsRunningThisScript(
|
||||
// List<RunningAgentModel> runningAgentModels) {
|
||||
// for (RunningAgentModel runningAgentModel : runningAgentModels) {
|
||||
// this.getAgentService().stop(runningAgentModel.getAgent(),
|
||||
// runningAgentModel.getAgentRunId());
|
||||
// }
|
||||
// }
|
||||
|
||||
this.highAvailableAgentPool.getAgentRunBlotters().put(
|
||||
runScenarioResultModel.getRunId(),
|
||||
buildAgentRunBlotter(runningAgentModel, testPlanId));
|
||||
totalRequireLoad -= loadForRunCurrent;
|
||||
}
|
||||
// private RunScenarioResultModel runAgentWithScenario(
|
||||
// RunScenarioModel runScenarioModel, Agent agent)
|
||||
// throws JAXBException {
|
||||
// try {
|
||||
// if (!this.getAgentService().getLoadFromAgent(agent.getHostName(),
|
||||
// runScenarioModel.getPoolSize())) {
|
||||
// return null;
|
||||
// }
|
||||
// return this.getAgentService().run(agent,
|
||||
// this._marshalRunScenarioModelToString(runScenarioModel));
|
||||
//
|
||||
// } catch (IOException e) {
|
||||
// e.printStackTrace();
|
||||
// return null;
|
||||
// }
|
||||
// }
|
||||
|
||||
if (!allocationFinish(totalRequireLoad)) {
|
||||
logger.error("allocationUnfinished, remain " + totalRequireLoad
|
||||
+ " unallocated");
|
||||
runningAgentModelList = rollbackForUnfinishedAllocation(runningAgentModelList);
|
||||
}
|
||||
return buildRunningScriptModel(runningAgentModelList, scriptId);
|
||||
}
|
||||
// private RunningAgentModel buildRunningAgentModel(Agent agent,
|
||||
// int loadInUse, int scriptId, UUID agentRunId) {
|
||||
// RunningAgentModel runningAgentModel = new RunningAgentModel();
|
||||
// runningAgentModel.setAgent(agent);
|
||||
// runningAgentModel.setLoadInUse(loadInUse);
|
||||
// runningAgentModel.setScriptId(scriptId);
|
||||
// runningAgentModel.setAgentRunId(agentRunId);
|
||||
// return runningAgentModel;
|
||||
// }
|
||||
//
|
||||
// private AgentRunBlotter buildAgentRunBlotter(
|
||||
// RunningAgentModel runningAgentModel, UUID testPlanId) {
|
||||
// AgentRunBlotter result = new AgentRunBlotter();
|
||||
// result.setRunningAgentModel(runningAgentModel);
|
||||
// result.setTestPlanId(testPlanId);
|
||||
// return result;
|
||||
// }
|
||||
|
||||
private List<RunningAgentModel> rollbackForUnfinishedAllocation(
|
||||
List<RunningAgentModel> runningAgentModelList) {
|
||||
stopAgentsRunningThisScript(runningAgentModelList);
|
||||
runningAgentModelList = null;
|
||||
return runningAgentModelList;
|
||||
}
|
||||
// private boolean inUse(Agent agent) {
|
||||
// return agent.getRemainLoad() < agent.getMaxLoad();
|
||||
// }
|
||||
//
|
||||
// private int getMin(int requireLoad, int remainLoadByStart) {
|
||||
// return remainLoadByStart >= requireLoad ? requireLoad
|
||||
// : remainLoadByStart;
|
||||
// }
|
||||
|
||||
private boolean allocationFinish(int requireLoad) {
|
||||
return requireLoad <= 0;
|
||||
}
|
||||
|
||||
private void stopAgentsRunningThisScript(
|
||||
List<RunningAgentModel> runningAgentModels) {
|
||||
for (RunningAgentModel runningAgentModel : runningAgentModels) {
|
||||
this.getAgentService().stop(runningAgentModel.getAgent(),
|
||||
runningAgentModel.getAgentRunId());
|
||||
}
|
||||
}
|
||||
|
||||
private RunScenarioResultModel runAgentWithScenario(
|
||||
RunScenarioModel runScenarioModel, Agent agent)
|
||||
throws JAXBException {
|
||||
try {
|
||||
if (!this.getAgentService().getLoadFromAgent(agent.getHostName(),
|
||||
runScenarioModel.getPoolSize())) {
|
||||
return null;
|
||||
}
|
||||
return this.getAgentService().run(agent,
|
||||
this._marshalRunScenarioModelToString(runScenarioModel));
|
||||
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private RunningAgentModel buildRunningAgentModel(Agent agent,
|
||||
int loadInUse, int scriptId, UUID agentRunId) {
|
||||
RunningAgentModel runningAgentModel = new RunningAgentModel();
|
||||
runningAgentModel.setAgent(agent);
|
||||
runningAgentModel.setLoadInUse(loadInUse);
|
||||
runningAgentModel.setScriptId(scriptId);
|
||||
runningAgentModel.setAgentRunId(agentRunId);
|
||||
return runningAgentModel;
|
||||
}
|
||||
|
||||
private AgentRunBlotter buildAgentRunBlotter(
|
||||
RunningAgentModel runningAgentModel, UUID testPlanId) {
|
||||
AgentRunBlotter result = new AgentRunBlotter();
|
||||
result.setRunningAgentModel(runningAgentModel);
|
||||
result.setTestPlanId(testPlanId);
|
||||
return result;
|
||||
}
|
||||
|
||||
private boolean inUse(Agent agent) {
|
||||
return agent.getRemainLoad() < agent.getMaxLoad();
|
||||
}
|
||||
|
||||
private int getMin(int requireLoad, int remainLoadByStart) {
|
||||
return remainLoadByStart >= requireLoad ? requireLoad
|
||||
: remainLoadByStart;
|
||||
}
|
||||
|
||||
private String _marshalRunScenarioModelToString(
|
||||
RunScenarioModel runScenarioModel) throws JAXBException {
|
||||
Marshaller marshaller;
|
||||
marshaller = JAXBContext.newInstance(runScenarioModel.getClass())
|
||||
.createMarshaller();
|
||||
StringWriter stringWriter = new StringWriter();
|
||||
marshaller.marshal(runScenarioModel, stringWriter);
|
||||
return stringWriter.toString();
|
||||
}
|
||||
|
||||
private RunningScriptModel buildRunningScriptModel(
|
||||
List<RunningAgentModel> runningAgentModels, int scriptId) {
|
||||
RunningScriptModel result = new RunningScriptModel();
|
||||
result.setScriptId(scriptId);
|
||||
result.setRunningAgents(runningAgentModels);
|
||||
return result;
|
||||
}
|
||||
// private String _marshalRunScenarioModelToString(
|
||||
// RunScenarioModel runScenarioModel) throws JAXBException {
|
||||
// Marshaller marshaller;
|
||||
// marshaller = JAXBContext.newInstance(runScenarioModel.getClass())
|
||||
// .createMarshaller();
|
||||
// StringWriter stringWriter = new StringWriter();
|
||||
// marshaller.marshal(runScenarioModel, stringWriter);
|
||||
// return stringWriter.toString();
|
||||
// }
|
||||
//
|
||||
// private RunningScriptModel buildRunningScriptModel(
|
||||
// List<RunningAgentModel> runningAgentModels, int scriptId) {
|
||||
// RunningScriptModel result = new RunningScriptModel();
|
||||
// result.setScriptId(scriptId);
|
||||
// result.setRunningAgents(runningAgentModels);
|
||||
// return result;
|
||||
// }
|
||||
}
|
||||
|
|
|
@ -53,9 +53,10 @@ public class TestPlanContext {
|
|||
}
|
||||
}
|
||||
|
||||
public void addToScriptMap(Integer scriptId,
|
||||
RunningScriptModel runningScriptModel) {
|
||||
this.runningScriptMap.put(scriptId, runningScriptModel);
|
||||
public void addToScriptMap(RunningScriptModel runningScriptModel) {
|
||||
this.runningScriptMap.put(
|
||||
new Integer(runningScriptModel.getScriptId()),
|
||||
runningScriptModel);
|
||||
}
|
||||
|
||||
public RunningScriptModel queryRunningScriptModel(int scriptId) {
|
||||
|
|
|
@ -1,11 +1,258 @@
|
|||
package org.bench4q.master.testPlan.loadcommand;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.StringWriter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
import javax.xml.bind.JAXBContext;
|
||||
import javax.xml.bind.JAXBException;
|
||||
import javax.xml.bind.Marshaller;
|
||||
|
||||
import org.apache.log4j.Logger;
|
||||
import org.bench4q.master.api.model.RunningAgentModel;
|
||||
import org.bench4q.master.api.model.RunningScriptModel;
|
||||
import org.bench4q.master.communication.agent.RunScenarioModel;
|
||||
import org.bench4q.master.communication.agent.RunScenarioResultModel;
|
||||
import org.bench4q.master.communication.agent.StopTestModel;
|
||||
import org.bench4q.master.entity.db.Agent;
|
||||
import org.bench4q.master.helper.ApplicationContextHelper;
|
||||
import org.bench4q.master.service.AgentService;
|
||||
import org.bench4q.master.service.ScriptService;
|
||||
import org.bench4q.master.testPlan.AgentRunBlotter;
|
||||
import org.bench4q.master.testPlan.highavailable.HighAvailableAgentPool;
|
||||
|
||||
public class ScriptLoadCommand implements LoadCommand {
|
||||
private RunningScriptModel runningScriptModel;
|
||||
private UUID testPlanRunID;
|
||||
private AgentService agentService;
|
||||
private ScriptService scriptService;
|
||||
private HighAvailableAgentPool highAvailableAgentPool;
|
||||
private static Logger logger = Logger.getLogger(ScriptLoadCommand.class);
|
||||
|
||||
public RunningScriptModel getRunningScriptModel() {
|
||||
return runningScriptModel;
|
||||
}
|
||||
|
||||
private void setRunningScriptModel(RunningScriptModel runningScriptModel) {
|
||||
this.runningScriptModel = runningScriptModel;
|
||||
}
|
||||
|
||||
public UUID getTestPlanRunID() {
|
||||
return testPlanRunID;
|
||||
}
|
||||
|
||||
private void setTestPlanRunID(UUID testPlanRunID) {
|
||||
this.testPlanRunID = testPlanRunID;
|
||||
}
|
||||
|
||||
public AgentService getAgentService() {
|
||||
return agentService;
|
||||
}
|
||||
|
||||
public void setAgentService(AgentService agentService) {
|
||||
this.agentService = agentService;
|
||||
}
|
||||
|
||||
private ScriptService getScriptService() {
|
||||
return scriptService;
|
||||
}
|
||||
|
||||
public void setScriptService(ScriptService scriptService) {
|
||||
this.scriptService = scriptService;
|
||||
}
|
||||
|
||||
public HighAvailableAgentPool getHighAvailableAgentPool() {
|
||||
return highAvailableAgentPool;
|
||||
}
|
||||
|
||||
public void setHighAvailableAgentPool(
|
||||
HighAvailableAgentPool highAvailableAgentPool) {
|
||||
this.highAvailableAgentPool = highAvailableAgentPool;
|
||||
}
|
||||
|
||||
public ScriptLoadCommand(RunningScriptModel runningScriptModel,
|
||||
UUID testPlanRunID) {
|
||||
this.setRunningScriptModel(runningScriptModel);
|
||||
this.setTestPlanRunID(testPlanRunID);
|
||||
this.setScriptService(ApplicationContextHelper.getContext().getBean(
|
||||
ScriptService.class));
|
||||
this.setAgentService(ApplicationContextHelper.getContext().getBean(
|
||||
AgentService.class));
|
||||
this.setHighAvailableAgentPool(ApplicationContextHelper.getContext()
|
||||
.getBean(HighAvailableAgentPool.class));
|
||||
}
|
||||
|
||||
public Object distributeLoad() {
|
||||
return null;
|
||||
RunScenarioModel runScenarioModel = this.getScriptService()
|
||||
.getRunSceniroModelByScriptId(
|
||||
this.getRunningScriptModel().getScriptId());
|
||||
if (runScenarioModel == null) {
|
||||
logger.error("runScenarioModel is null!");
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
RunningScriptModel result = this.runAgentsWithScenario(
|
||||
runScenarioModel, this.getRunningScriptModel()
|
||||
.getRequireLoad(), this.getRunningScriptModel()
|
||||
.getScriptId(), this.getTestPlanRunID());
|
||||
|
||||
if (result.getRunningAgents() == null) {
|
||||
logger.error("runAgentsWithScenario fails where scriptId = "
|
||||
+ result.getScriptId());
|
||||
return null;
|
||||
}
|
||||
result.setRequireLoad(this.getRunningScriptModel().getRequireLoad());
|
||||
result.setConfig(this.getRunningScriptModel().getConfig());
|
||||
return result;
|
||||
} catch (Exception e) {
|
||||
logger.error(e.getMessage() + "whose scriptID is "
|
||||
+ this.getRunningScriptModel().getScriptId()
|
||||
+ " and TestPlanID is "
|
||||
+ this.getTestPlanRunID().toString());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private RunningScriptModel runAgentsWithScenario(
|
||||
RunScenarioModel runScenarioModel, int totalRequireLoad,
|
||||
int scriptId, UUID testPlanId) throws JAXBException,
|
||||
ScriptLoadDistributeException {
|
||||
RunningAgentModel runningAgentModel = new RunningAgentModel();
|
||||
RunScenarioResultModel runScenarioResultModel = new RunScenarioResultModel();
|
||||
List<RunningAgentModel> runningAgentModelList = new ArrayList<RunningAgentModel>();
|
||||
int loadForRunCurrent;
|
||||
|
||||
for (Agent agent : this.getHighAvailableAgentPool()
|
||||
.getHighAvailablePool()) {
|
||||
if (allocationFinish(totalRequireLoad)) {
|
||||
break;
|
||||
}
|
||||
if (this.getHighAvailableAgentPool().queryAgentStatus(agent) == null
|
||||
|| inUse(agent)) {
|
||||
continue;
|
||||
}
|
||||
loadForRunCurrent = getMin(totalRequireLoad, agent.getRemainLoad());
|
||||
runScenarioModel.setPoolSize(loadForRunCurrent);
|
||||
runScenarioModel.setTotalCount(loadForRunCurrent);
|
||||
runScenarioResultModel = runAgentWithScenario(runScenarioModel,
|
||||
agent);
|
||||
if (runScenarioResultModel == null) {
|
||||
continue;
|
||||
}
|
||||
runningAgentModel = buildRunningAgentModel(agent,
|
||||
loadForRunCurrent, scriptId,
|
||||
runScenarioResultModel.getRunId());
|
||||
runningAgentModelList.add(runningAgentModel);
|
||||
|
||||
this.getHighAvailableAgentPool()
|
||||
.getAgentRunBlotters()
|
||||
.put(runScenarioResultModel.getRunId(),
|
||||
buildAgentRunBlotter(runningAgentModel, testPlanId));
|
||||
totalRequireLoad -= loadForRunCurrent;
|
||||
}
|
||||
if (!allocationFinish(totalRequireLoad)) {
|
||||
logger.error("allocationUnfinished, remain " + totalRequireLoad
|
||||
+ " unallocated");
|
||||
throw new ScriptLoadDistributeException();
|
||||
}
|
||||
return buildRunningScriptModel(runningAgentModelList, scriptId);
|
||||
}
|
||||
|
||||
private boolean allocationFinish(int requireLoad) {
|
||||
return requireLoad <= 0;
|
||||
}
|
||||
|
||||
private boolean inUse(Agent agent) {
|
||||
return agent.getRemainLoad() < agent.getMaxLoad();
|
||||
}
|
||||
|
||||
private int getMin(int requireLoad, int remainLoadByStart) {
|
||||
return remainLoadByStart >= requireLoad ? requireLoad
|
||||
: remainLoadByStart;
|
||||
}
|
||||
|
||||
private RunningAgentModel buildRunningAgentModel(Agent agent,
|
||||
int loadInUse, int scriptId, UUID agentRunId) {
|
||||
RunningAgentModel runningAgentModel = new RunningAgentModel();
|
||||
runningAgentModel.setAgent(agent);
|
||||
runningAgentModel.setLoadInUse(loadInUse);
|
||||
runningAgentModel.setScriptId(scriptId);
|
||||
runningAgentModel.setAgentRunId(agentRunId);
|
||||
return runningAgentModel;
|
||||
}
|
||||
|
||||
private AgentRunBlotter buildAgentRunBlotter(
|
||||
RunningAgentModel runningAgentModel, UUID testPlanId) {
|
||||
AgentRunBlotter result = new AgentRunBlotter();
|
||||
result.setRunningAgentModel(runningAgentModel);
|
||||
result.setTestPlanId(testPlanId);
|
||||
return result;
|
||||
}
|
||||
|
||||
private RunScenarioResultModel runAgentWithScenario(
|
||||
RunScenarioModel runScenarioModel, Agent agent)
|
||||
throws JAXBException {
|
||||
try {
|
||||
if (!this.getAgentService().getLoadFromAgent(agent.getHostName(),
|
||||
runScenarioModel.getPoolSize())) {
|
||||
return null;
|
||||
}
|
||||
return this.getAgentService().run(agent,
|
||||
this._marshalRunScenarioModelToString(runScenarioModel));
|
||||
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private String _marshalRunScenarioModelToString(
|
||||
RunScenarioModel runScenarioModel) throws JAXBException {
|
||||
Marshaller marshaller;
|
||||
marshaller = JAXBContext.newInstance(runScenarioModel.getClass())
|
||||
.createMarshaller();
|
||||
StringWriter stringWriter = new StringWriter();
|
||||
marshaller.marshal(runScenarioModel, stringWriter);
|
||||
return stringWriter.toString();
|
||||
}
|
||||
|
||||
private RunningScriptModel buildRunningScriptModel(
|
||||
List<RunningAgentModel> runningAgentModels, int scriptId) {
|
||||
RunningScriptModel result = new RunningScriptModel();
|
||||
result.setScriptId(scriptId);
|
||||
result.setRunningAgents(runningAgentModels);
|
||||
return result;
|
||||
}
|
||||
|
||||
public void retieveLoad() {
|
||||
stopAgentsRunningThisScript(this.getRunningScriptModel()
|
||||
.getRunningAgents());
|
||||
if (this.getRunningScriptModel().getRunningAgents().size() > 0) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private void stopAgentsRunningThisScript(
|
||||
List<RunningAgentModel> runningAgentModels) {
|
||||
if (runningAgentModels == null) {
|
||||
return;
|
||||
}
|
||||
for (RunningAgentModel runningAgentModel : runningAgentModels) {
|
||||
if (runningAgentModel.getAgent().getCurrentStatus() == AgentService.AGENT_STATUS_BreakDown) {
|
||||
runningAgentModels.remove(runningAgentModel);
|
||||
continue;
|
||||
} else if (stopAgentSuccess(runningAgentModel)) {
|
||||
runningAgentModels.remove(runningAgentModel);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private boolean stopAgentSuccess(RunningAgentModel runningAgentModel) {
|
||||
StopTestModel resultModel = this.getAgentService()
|
||||
.stop(runningAgentModel.getAgent(),
|
||||
runningAgentModel.getAgentRunId());
|
||||
return (resultModel != null) && resultModel.isSuccess();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
package org.bench4q.master.testPlan.loadcommand;
|
||||
|
||||
public class ScriptLoadDistributeException extends Exception {
|
||||
private static final long serialVersionUID = -5230579598325900610L;
|
||||
private String message;
|
||||
|
||||
public String getMessage() {
|
||||
return message;
|
||||
}
|
||||
|
||||
public void setMessage(String message) {
|
||||
this.message = message;
|
||||
}
|
||||
|
||||
public ScriptLoadDistributeException() {
|
||||
this.setMessage("Distribute load for script fails!");
|
||||
}
|
||||
}
|
|
@ -8,5 +8,4 @@ public class TestPlanLoadCommand implements LoadCommand {
|
|||
|
||||
public void retieveLoad() {
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue