package com.griddynamics.jagger.util.generators; import com.griddynamics.jagger.engine.e1.aggregator.session.BasicAggregator; import com.griddynamics.jagger.engine.e1.aggregator.workload.DurationLogProcessor; import com.griddynamics.jagger.engine.e1.aggregator.workload.MetricLogProcessor; import com.griddynamics.jagger.engine.e1.aggregator.workload.ProfilerLogProcessor; import com.griddynamics.jagger.engine.e1.aggregator.workload.WorkloadAggregator; import com.griddynamics.jagger.engine.e1.collector.BasicSessionCollector; import com.griddynamics.jagger.engine.e1.collector.MasterWorkloadCollector; import com.griddynamics.jagger.engine.e1.collector.limits.LimitSetConfig; import com.griddynamics.jagger.engine.e1.sessioncomparation.BaselineSessionProvider; import com.griddynamics.jagger.master.DistributionListener; import com.griddynamics.jagger.master.configuration.Configuration; import com.griddynamics.jagger.master.configuration.SessionExecutionListener; import com.griddynamics.jagger.master.configuration.Task; import com.griddynamics.jagger.user.test.configurations.JLoadScenario; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.support.ManagedList; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; import static java.util.function.Function.identity; /** * Generates {@link Configuration} entity * from {@link JLoadScenario} object. */ public class ConfigurationGenerator { private BasicSessionCollector basicSessionCollector; private MasterWorkloadCollector e1MasterCollector; private BasicAggregator basicAggregator; private WorkloadAggregator e1ScenarioAggregator; private MetricLogProcessor metricLogProcessor; private ProfilerLogProcessor profilerLogProcessor; private DurationLogProcessor durationLogProcessor; private Map<String, JLoadScenario> jaggerLoadScenarios = Collections.emptyMap(); private boolean useBuilders; private String jLoadScenarioToExecute; private Map<String, Configuration> configurations = Collections.emptyMap(); private boolean monitoringEnable; private BaselineSessionProvider baselineSessionProvider; private LimitSetConfig limitSetConfig; private ConfigurationProperties configurationProperties; public Set<String> getJaggerLoadScenarioNames() { if (useBuilders) { return new HashSet<>(jaggerLoadScenarios.keySet()); } return new HashSet<>(configurations.keySet()); } @Autowired(required = false) public void setJaggerLoadScenarios(List<JLoadScenario> jLoadScenarios) { this.jaggerLoadScenarios = jLoadScenarios.stream().collect(Collectors.toMap(JLoadScenario::getId, identity())); } @Autowired(required = false) public void setConfigurations(Map<String, Configuration> configurations) { this.configurations = configurations; } public Configuration generate() { if (useBuilders) { JLoadScenario jLoadScenario = jaggerLoadScenarios.get(jLoadScenarioToExecute); if (jLoadScenario == null) { throw new IllegalArgumentException(String.format( "No Jagger load scenario with name %s. Available load scenarios: %s", jLoadScenarioToExecute, jaggerLoadScenarios.keySet())); } return generate(jLoadScenario); } Configuration configuration = configurations.get(jLoadScenarioToExecute); if (configuration == null) { throw new IllegalArgumentException(String.format("No Jagger configuration with name %s. Available: %s", jLoadScenarioToExecute, configurations.keySet())); } return configuration; } /** * Generates {@link Configuration} from {@link JLoadScenario}. * * @param jLoadScenario user configuration. * @return jagger configuration. */ public Configuration generate(JLoadScenario jLoadScenario) { Configuration configuration = new Configuration(); List<Task> tasks = jLoadScenario.getTestGroups() .stream() .map(task -> TestGroupGenerator.generateFromTestGroup(task, monitoringEnable, baselineSessionProvider, limitSetConfig, configurationProperties)) .collect(Collectors.toList()); configuration.setTasks(tasks); configuration.setLoadScenarioListeners(jLoadScenario.getListeners()); ManagedList<SessionExecutionListener> seListeners = new ManagedList<>(); seListeners.add(basicSessionCollector); seListeners.add(basicAggregator); if (jLoadScenario.getPercentileValues() != null) { durationLogProcessor.setGlobalPercentilesKeys(jLoadScenario.getPercentileValues()); durationLogProcessor.setTimeWindowPercentilesKeys(jLoadScenario.getPercentileValues()); } configuration.setSessionExecutionListeners(seListeners); ManagedList<DistributionListener> teListeners = new ManagedList<>(); teListeners.add(basicSessionCollector); teListeners.add(basicAggregator); teListeners.add(e1MasterCollector); teListeners.add(e1ScenarioAggregator); teListeners.add(metricLogProcessor); teListeners.add(profilerLogProcessor); teListeners.add(durationLogProcessor); configuration.setTaskExecutionListeners(teListeners); return configuration; } public void setBasicSessionCollector(BasicSessionCollector basicSessionCollector) { this.basicSessionCollector = basicSessionCollector; } public void setE1MasterCollector(MasterWorkloadCollector e1MasterCollector) { this.e1MasterCollector = e1MasterCollector; } public void setBasicAggregator(BasicAggregator basicAggregator) { this.basicAggregator = basicAggregator; } public void setE1ScenarioAggregator(WorkloadAggregator e1ScenarioAggregator) { this.e1ScenarioAggregator = e1ScenarioAggregator; } public void setMetricLogProcessor(MetricLogProcessor metricLogProcessor) { this.metricLogProcessor = metricLogProcessor; } public void setProfilerLogProcessor(ProfilerLogProcessor profilerLogProcessor) { this.profilerLogProcessor = profilerLogProcessor; } public void setDurationLogProcessor(DurationLogProcessor durationLogProcessor) { this.durationLogProcessor = durationLogProcessor; } public boolean isUseBuilders() { return useBuilders; } public void setUseBuilders(boolean useBuilders) { this.useBuilders = useBuilders; } public String getjLoadScenarioToExecute() { return jLoadScenarioToExecute; } public void setJLoadScenarioIdToExecute(String jLoadScenarioToExecute) { this.jLoadScenarioToExecute = jLoadScenarioToExecute; } public void setMonitoringEnable(boolean monitoringEnable) { this.monitoringEnable = monitoringEnable; } public void setBaselineSessionProvider(BaselineSessionProvider baselineSessionProvider) { this.baselineSessionProvider = baselineSessionProvider; } public void setLimitSetConfig(LimitSetConfig limitSetConfig) { this.limitSetConfig = limitSetConfig; } public void setConfigurationProperties(ConfigurationProperties configurationProperties) { this.configurationProperties = configurationProperties; } }