package com.intuit.tank.project;
/*
* #%L
* JSF Support Beans
* %%
* Copyright (C) 2011 - 2015 Intuit Inc.
* %%
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
* #L%
*/
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.annotation.PostConstruct;
import javax.enterprise.context.ConversationScoped;
import javax.inject.Inject;
import javax.inject.Named;
import org.apache.commons.lang3.math.NumberUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import com.intuit.tank.util.Messages;
import com.intuit.tank.ProjectBean;
import com.intuit.tank.dao.JobConfigurationDao;
import com.intuit.tank.util.TestParamUtil;
import com.intuit.tank.vm.api.enumerated.IncrementStrategy;
import com.intuit.tank.vm.api.enumerated.TerminationPolicy;
import com.intuit.tank.vm.api.enumerated.VMRegion;
import com.intuit.tank.vm.settings.TankConfig;
import com.intuit.tank.vm.settings.TimeUtil;
/**
*
* UsersAndTimes
*
* @author dangleton
*
*/
@Named
@ConversationScoped
public class UsersAndTimes implements Serializable {
private static final long serialVersionUID = 1L;
@SuppressWarnings("unused")
private static final Logger LOG = LogManager.getLogger(UsersAndTimes.class);
@Inject
private ProjectBean projectBean;
private TankConfig tankConfig = new TankConfig();
@Inject
private Messages messages;
private List<JobRegion> jobRegions;
/**
* initializes the instance variables with the project and workload
*
* @param project
* the value of the project that should be assigned.
* @param workload
* the value of the workload that should be assigned.
*/
public void init() {
getJobRegions();
}
public List<JobRegion> getJobRegions() {
if (jobRegions == null) {
Set<JobRegion> regions = projectBean.getJobConfiguration().getJobRegions();
Set<VMRegion> configuredRegions = new HashSet<VMRegion>(tankConfig.getVmManagerConfig()
.getConfiguredRegions());
if (tankConfig.getStandalone()) {
JobRegion standaloneRegion = new JobRegion(VMRegion.STANDALONE, "0");
boolean found = false;
for (JobRegion region : regions) {
if (region.getRegion() == VMRegion.US_EAST || region.getRegion() == VMRegion.STANDALONE) {
standaloneRegion = region;
standaloneRegion.setRegion(VMRegion.STANDALONE);
found = true;
break;
}
}
if (!found) {
regions.clear();
regions.add(standaloneRegion);
}
} else {
for (JobRegion region : regions) {
configuredRegions.remove(region.getRegion());
}
for (VMRegion region : configuredRegions) {
if (tankConfig.getStandalone()) {
} else {
regions.add(new JobRegion(region, "0"));
}
}
}
jobRegions = new ArrayList<JobRegion>(regions);
Collections.sort(jobRegions);
}
return jobRegions;
}
//
// /**
// * @return The number of users in the east region.
// */
// public String getEastUsers() {
// return getUsersForRegion(VMRegion.US_EAST);
// }
//
// /**
// * Sets the number of east users
// *
// * @param eastUsers
// * The number of users in the east region.
// */
// public void setEastUsers(String users) {
// if (!TestParamUtil.isValidExpression(users)) {
// messages.error("Cannot parse users " + users);
// } else {
// setUsersForRegion(VMRegion.US_EAST, users);
// }
// }
//
// /**
// * @return the number of users in the west region.
// */
// public String getWestUsers() {
// return getUsersForRegion(VMRegion.US_WEST_1);
// }
//
// /**
// * Sets the number of users in the west region
// *
// * @param users
// * the number of users in the west region
// */
// public void setWestUsers(String users) {
// if (!TestParamUtil.isValidExpression(users)) {
// messages.error("Cannot parse users " + users);
// } else {
// setUsersForRegion(VMRegion.US_WEST_1, users);
// }
// }
//
// /**
// * Helps in setting the values of the users in a particular region
// *
// * @param region
// * The region where the users are to be set.
// * @param users
// * The value of the number of users that is to be set.
// */
// private void setUsersForRegion(VMRegion region, String users) {
// Set<JobRegion> jobRegions = projectBean.getJobConfiguration().getJobRegions();
//
// if (jobRegions.isEmpty() || jobRegions.size() < 2) {
// JobRegion ejr = new JobRegion();
// ejr.setUsers("0");
// ejr.setRegion(VMRegion.US_EAST);
//
// JobRegion wjr = new JobRegion();
// wjr.setUsers("0");
// wjr.setRegion(VMRegion.US_WEST_1);
// jobRegions.add(ejr);
// jobRegions.add(wjr);
// }
// for (JobRegion jobRegion : jobRegions) {
// if (jobRegion.getRegion() == region) {
// jobRegion.setUsers(users);
// break;
// }
// }
// }
//
// /**
// * Returns the number of users in a given region
// *
// * @param region
// * The region.
// * @return the number of users in the given region
// * @see com.intuit.tank.vm.api.enumerated.VMRegion
// */
// private String getUsersForRegion(VMRegion region) {
// String retVal = "0";
// Set<JobRegion> jobRegions = projectBean.getJobConfiguration().getJobRegions();
// for (JobRegion jobRegion : jobRegions) {
// if (jobRegion.getRegion() == region) {
// retVal = jobRegion.getUsers();
// break;
// }
// }
// return retVal;
// }
/**
* Persists the workload object in the database. It also fires an event for project modified.
*/
public void save() {
// WorkloadDao wd = new WorkloadDao();
// workload.setJobConfiguration(jobConfiguration);
// wd.saveOrUpdate(workload);
// projectEvent.fire(project);
// projectBean.getJobConfiguration().getJobRegions().clear();
// projectBean.getJobConfiguration().getJobRegions().addAll(getJobRegions());
new JobConfigurationDao().saveOrUpdate(projectBean.getJobConfiguration());
jobRegions = null;
}
public void copyTo(Workload copyTo) {
JobConfiguration jobConfiguration = projectBean.getJobConfiguration();
JobConfiguration jc = copyTo.getJobConfiguration();
jc.setBaselineVirtualUsers(jobConfiguration.getBaselineVirtualUsers());
jc.setDataFileIds(new HashSet<Integer>(jobConfiguration.getDataFileIds()));
jc.setIncrementStrategy(jobConfiguration.getIncrementStrategy());
jc.setLocation(jobConfiguration.getLocation());
jc.setRampTime(jobConfiguration.getRampTime());
jc.setReportingMode(jobConfiguration.getReportingMode());
jc.setSimulationTime(jobConfiguration.getSimulationTime());
jc.setTerminationPolicy(jobConfiguration.getTerminationPolicy());
jc.setUserIntervalIncrement(jobConfiguration.getUserIntervalIncrement());
jc.setVariables(jobConfiguration.getVariables());
Set<JobRegion> regions = new HashSet<JobRegion>();
for (JobRegion jr : jobConfiguration.getJobRegions()) {
regions.add(copyRegion(jr));
}
jc.setJobRegions(regions);
jc.setParent(copyTo);
copyTo.setJobConfiguration(jc);
}
/**
* @param jr
* @return
*/
private JobRegion copyRegion(JobRegion jr) {
JobRegion ret = new JobRegion();
ret.setRegion(jr.getRegion());
ret.setUsers(jr.getUsers());
return ret;
}
/**
* @return The termination policy of the job.
* @see com.intuit.tank.vm.api.enumerated.TerminationPolicy
*/
public TerminationPolicy getTerminationPolicy() {
return projectBean.getJobConfiguration().getTerminationPolicy();
}
/**
*
* @return
*/
public TerminationPolicy[] getTerminationPolicyList() {
return TerminationPolicy.values();
}
/**
* Sets the termination policy for the job. If the termination policy is 'Script Loops Completed' the value that is
* set is 'TerminationPolicy.script' else the value is set to 'TerminationPolicy.time'
*
* @param terminationPolicy
* @see com.intuit.tank.vm.api.enumerated.TerminationPolicy
*/
public void setTerminationPolicy(TerminationPolicy terminationPolicy) {
projectBean.getJobConfiguration().setTerminationPolicy(terminationPolicy);
}
/**
* @return the simulation time in the following format hh:mm:ss
*/
public String getSimulationTime() {
if (projectBean.getJobConfiguration().getSimulationTimeExpression() != null) {
return projectBean.getJobConfiguration().getSimulationTimeExpression();
}
return TimeUtil.toTimeString(projectBean.getJobConfiguration().getSimulationTime());
}
/**
* Sets the simulation time for the job
*
* @param simulationTime
* the simulation time is in the format hh:mm:ss
*/
public void setSimulationTime(String simulationTime) {
try {
if (!TestParamUtil.isValidExpression(simulationTime)) {
messages.error("Cannot parse simulation time " + simulationTime);
} else {
projectBean.getJobConfiguration().setSimulationTimeExpression(simulationTime);
}
} catch (RuntimeException e) {
messages.error("Cannot format simulation time " + simulationTime);
}
}
/**
* @return the ramp time for the job in the format hh:mm:ss
*/
public String getRampTime() {
if (projectBean.getJobConfiguration().getRampTimeExpression() != null) {
return projectBean.getJobConfiguration().getRampTimeExpression();
}
return TimeUtil.toTimeString(projectBean.getJobConfiguration().getRampTime());
}
/**
* Sets the ramp time for the job.
*
* @param rampTime
* The ramp time should be in the following format hh:mm:ss
*/
public void setRampTime(String rampTime) {
try {
if (!TestParamUtil.isValidExpression(rampTime)) {
messages.error("Cannot parse ramp time " + rampTime);
} else {
projectBean.getJobConfiguration().setRampTimeExpression(rampTime);
}
} catch (RuntimeException e) {
messages.error("Cannot format ramp time " + rampTime);
}
}
/**
* @return the increment strategy for the job
*/
public IncrementStrategy getIncrementStrategy() {
return projectBean.getJobConfiguration().getIncrementStrategy();
}
public IncrementStrategy[] getIncrementStrategyList() {
return IncrementStrategy.values();
}
/**
* Sets the increment strategy for the job
*
* @param workloadType
* The increment strategy for the job.
*/
public void setIncrementStrategy(IncrementStrategy strategy) {
projectBean.getJobConfiguration().setIncrementStrategy(strategy);
}
/**
* @return The number of start users for the job
*/
public String getStartUsers() {
return String.valueOf(projectBean.getJobConfiguration().getBaselineVirtualUsers());
}
/**
* Sets the number of start users for the job.
*
* @param startUsers
* String representation of an integer value
*/
public void setStartUsers(String startUsers) {
projectBean.getJobConfiguration().setBaselineVirtualUsers(Integer.parseInt(startUsers));
}
/**
* @return the number of users increment for the job
*/
public String getUserIncrement() {
if (projectBean.getJobConfiguration().getUserIntervalIncrement() > 0) {
return String.valueOf(projectBean.getJobConfiguration().getUserIntervalIncrement());
}
return "1";
}
/**
* Sets the number of users to be incremented for the job
*
* @param startUsers
* String representation of an integer value.
*/
public void setUserIncrement(String startUsers) {
if (NumberUtils.isNumber(startUsers)) {
projectBean.getJobConfiguration().setUserIntervalIncrement(Integer.parseInt(startUsers));
}
}
/**
* @return total number of east and west region users
*/
public int getTotalUsers() {
int totalUsers = 0;
for (JobRegion jobRegion : getJobRegions()) {
try {
if (NumberUtils.isDigits(jobRegion.getUsers())) {
totalUsers += Integer.valueOf(jobRegion.getUsers());
}
} catch (NumberFormatException e) {
LOG.info("cannot parse users" + jobRegion.getUsers());
}
}
return totalUsers;
}
}