From 416aafc264d975e4e7887beb102dfab31b8498e0 Mon Sep 17 00:00:00 2001 From: lucian-baciu Date: Thu, 18 Dec 2025 18:33:24 +0200 Subject: [PATCH 1/7] SED-4157-executions history --- .../src/test/resources/step.properties | 2 +- .../step/core/repositories/ImportResult.java | 9 +++++ .../ExecutionHistoryReportPlugin.java | 39 +++++++++++++++++++ .../core/execution/ExecutionEngineRunner.java | 25 +++++++++++- .../step/core/execution/model/Execution.java | 19 +++++++++ .../execution/model/ExecutionAccessor.java | 1 + .../model/ExecutionAccessorImpl.java | 20 ++++++++++ .../model/ExecutionResultSnapshot.java | 37 ++++++++++++++++++ .../core/repositories/AbstractRepository.java | 12 ++++++ .../step/core/repositories/Repository.java | 1 + .../repositories/RepositoryObjectManager.java | 6 ++- 11 files changed, 168 insertions(+), 3 deletions(-) create mode 100644 step-plans/step-plans-base-artefacts/src/main/java/step/reporting/ExecutionHistoryReportPlugin.java create mode 100644 step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionResultSnapshot.java diff --git a/step-controller/step-controller-backend/src/test/resources/step.properties b/step-controller/step-controller-backend/src/test/resources/step.properties index f821e516c1..cd21b24d06 100644 --- a/step-controller/step-controller-backend/src/test/resources/step.properties +++ b/step-controller/step-controller-backend/src/test/resources/step.properties @@ -53,7 +53,7 @@ plugins.selenium.libs.3.x=../../../../step-distribution/step-distribution-parent plugins.selenium.libs.2.x=../../../../step-distribution/step-distribution-parent/step-distribution-controller/template-controller/ext/selenium/selenium-2.53.1 plugins.jmeter.home=../../../../step-distribution/step-distribution-parent/step-distribution-controller/template-controller/ext/jmeter plugins.javascript.libs=../../../../step-distribution/step-distribution-parent/step-distribution-controller/template-controller/ext/javascript -plugins.groovy.libs=../../../../step-distribution/step-distribution-parent/step-distribution-controller/template-controller/ext/groovy +plugins.groovy.libs=../../../step-distribution/step-distribution-controller/template-controller/ext/groovy authentication=true # Defines the path to the embedded function packages # plugins.FunctionPackagePlugin.embeddedpackages.folder=../../../../step-distribution/step-distribution-parent/step-distribution-controller/template-controller/plugins/keywords diff --git a/step-core/src/main/java/step/core/repositories/ImportResult.java b/step-core/src/main/java/step/core/repositories/ImportResult.java index 7df94fd1f4..a5f9dda80e 100644 --- a/step-core/src/main/java/step/core/repositories/ImportResult.java +++ b/step-core/src/main/java/step/core/repositories/ImportResult.java @@ -28,6 +28,7 @@ public class ImportResult implements Serializable { protected boolean successful = false;; protected String planId; + protected String canonicalPlanName; List errors; @@ -47,6 +48,14 @@ public void setPlanId(String planId) { this.planId = planId; } + public String getCanonicalPlanName() { + return canonicalPlanName; + } + + public void setCanonicalPlanName(String canonicalPlanName) { + this.canonicalPlanName = canonicalPlanName; + } + public List getErrors() { return errors; } diff --git a/step-plans/step-plans-base-artefacts/src/main/java/step/reporting/ExecutionHistoryReportPlugin.java b/step-plans/step-plans-base-artefacts/src/main/java/step/reporting/ExecutionHistoryReportPlugin.java new file mode 100644 index 0000000000..b2adb0d9a9 --- /dev/null +++ b/step-plans/step-plans-base-artefacts/src/main/java/step/reporting/ExecutionHistoryReportPlugin.java @@ -0,0 +1,39 @@ +package step.reporting; + +import step.core.execution.ExecutionContext; +import step.core.execution.model.Execution; +import step.core.execution.model.ExecutionAccessor; +import step.core.execution.model.ExecutionResultSnapshot; +import step.core.plugins.Plugin; +import step.engine.plugins.AbstractExecutionEnginePlugin; + +import java.util.List; +import java.util.stream.Collectors; + +@Plugin +public class ExecutionHistoryReportPlugin extends AbstractExecutionEnginePlugin { + + @Override + public void executionStart(ExecutionContext context) { + // TOOD collect the executions here too + } + + @Override + public void afterExecutionEnd(ExecutionContext context) { + ExecutionAccessor executionAccessor = context.getExecutionAccessor(); + Execution execution = context.getExecutionManager().getExecution(); + // endTime is not set here + long searchBeforeTimestamp = System.currentTimeMillis() - 1; + List pastExecutionsSnapshots = executionAccessor.getLastEndedExecutionsByCanonicalPlanName(execution.getCanonicalPlanName(), 10, searchBeforeTimestamp) + .stream() + .map(e -> new ExecutionResultSnapshot() + .setId(e.getId().toString()) + .setResult(e.getResult()) + .setStatus(e.getStatus()) + ) + .collect(Collectors.toList()); + execution.setHistoryResults(pastExecutionsSnapshots); + executionAccessor.save(execution); + } + +} diff --git a/step-plans/step-plans-core/src/main/java/step/core/execution/ExecutionEngineRunner.java b/step-plans/step-plans-core/src/main/java/step/core/execution/ExecutionEngineRunner.java index da368e5a25..db58cef5fd 100644 --- a/step-plans/step-plans-core/src/main/java/step/core/execution/ExecutionEngineRunner.java +++ b/step-plans/step-plans-core/src/main/java/step/core/execution/ExecutionEngineRunner.java @@ -86,9 +86,27 @@ protected PlanRunnerResult execute() { addImportResultToExecution(importResult); saveFailureReportWithResult(ReportNodeStatus.VETOED); } else { + String canonicalPlanName; try { - Plan plan = getPlanFromExecutionParametersOrImport(); + ExecutionParameters executionParameters = executionContext.getExecutionParameters(); + Plan plan = executionParameters.getPlan(); + if (plan == null) { + ImportResult importResult = importPlan(executionContext); + canonicalPlanName = importResult.getCanonicalPlanName(); + addImportResultToExecution(importResult); + if (importResult.isSuccessful()) { + PlanAccessor planAccessor = executionContext.getPlanAccessor(); + plan = planAccessor.get(new ObjectId(importResult.getPlanId())); + } else { + throw new PlanImportException(); + } + } else { + // plan already exists in memory + canonicalPlanName = plan.getId().toString(); + } + addPlanToContextAndUpdateExecution(plan); + addCanonicalPlanNameToExecution(canonicalPlanName); logger.info(messageWithId("Starting execution.")); updateStatus(ExecutionStatus.ESTIMATING); @@ -176,6 +194,7 @@ private List getExecutionVetoes() { .collect(Collectors.toList()); } + // TODO from here we need to extract the importResult, somehow private Plan getPlanFromExecutionParametersOrImport() throws PlanImportException { ExecutionParameters executionParameters = executionContext.getExecutionParameters(); Plan executionParametersPlan = executionParameters.getPlan(); @@ -209,6 +228,10 @@ private void addPlanToContextAndUpdateExecution(Plan plan) { }); } + private void addCanonicalPlanNameToExecution(String canonicalPlanName) { + updateExecution(execution -> execution.setCanonicalPlanName(canonicalPlanName)); + } + private String messageWithId(String message) { return message + " Execution ID: " + executionContext.getExecutionId(); } diff --git a/step-plans/step-plans-core/src/main/java/step/core/execution/model/Execution.java b/step-plans/step-plans-core/src/main/java/step/core/execution/model/Execution.java index 81ef0004d7..097b3ef602 100644 --- a/step-plans/step-plans-core/src/main/java/step/core/execution/model/Execution.java +++ b/step-plans/step-plans-core/src/main/java/step/core/execution/model/Execution.java @@ -44,6 +44,7 @@ public class Execution extends AbstractOrganizableObject implements EnricheableO private ReportNodeStatus result; private List lifecycleErrors; private String planId; + private String canonicalPlanName; private ImportResult importResult; private List reportExports; private String executionTaskID; @@ -54,6 +55,7 @@ public class Execution extends AbstractOrganizableObject implements EnricheableO private ExecutiontTaskParameters executiontTaskParameters; private String resolvedPlanRootNodeId; private String agentsInvolved; + private List historyResults; public Execution() { super(); @@ -148,6 +150,14 @@ public void setPlanId(String planId) { this.planId = planId; } + public String getCanonicalPlanName() { + return canonicalPlanName; + } + + public void setCanonicalPlanName(String canonicalPlanName) { + this.canonicalPlanName = canonicalPlanName; + } + /** * @return the result of the import phase from the external repository (ALM, Jira, etc) */ @@ -245,6 +255,15 @@ public void setAgentsInvolved(String agentsInvolved) { this.agentsInvolved = agentsInvolved; } + public List getHistoryResults() { + return historyResults; + } + + public Execution setHistoryResults(List historyResults) { + this.historyResults = historyResults; + return this; + } + @Override public String toString() { return "Execution [startTime=" + startTime + ", endTime=" + endTime + ", description=" + description diff --git a/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionAccessor.java b/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionAccessor.java index 11c590f014..6690061a1c 100644 --- a/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionAccessor.java +++ b/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionAccessor.java @@ -51,4 +51,5 @@ public interface ExecutionAccessor extends Accessor, ExecutionProvide List getLastEndedExecutionsBySchedulerTaskID(String schedulerTaskID, int limit, Long from, Long to); + List getLastEndedExecutionsByCanonicalPlanName(String canonicalPlanName, int limit, Long from); } diff --git a/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionAccessorImpl.java b/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionAccessorImpl.java index f4733ca29e..89aff5f9fb 100644 --- a/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionAccessorImpl.java +++ b/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionAccessorImpl.java @@ -46,6 +46,8 @@ public void createIndexesIfNeeded(Long ttl) { new IndexField("endTime",Order.DESC, null)))); collectionDriver.createOrUpdateCompoundIndex(new LinkedHashSet<>(List.of(new IndexField("planId",Order.ASC, null), new IndexField("endTime",Order.DESC, null)))); + collectionDriver.createOrUpdateCompoundIndex(new LinkedHashSet<>(List.of(new IndexField("canonicalPlanName",Order.ASC, null), + new IndexField("endTime",Order.DESC, null)))); } @Override @@ -174,4 +176,22 @@ public List getLastEndedExecutionsBySchedulerTaskID(String schedulerT order, 0, limit, 0) .collect(Collectors.toList()); } + + @Override + public List getLastEndedExecutionsByCanonicalPlanName(String canonicalPlanName, int limit, Long from) { + SearchOrder order = new SearchOrder("endTime", -1); + + List filters = new ArrayList<>(List.of( + Filters.equals("canonicalPlanName", canonicalPlanName), + Filters.equals("status", ExecutionStatus.ENDED.name()) + )); + + if (from != null) { + filters.add(Filters.lte("endTime", from)); + } + + return collectionDriver + .find(Filters.and(filters), order, 0, limit, 0) + .collect(Collectors.toList()); + } } diff --git a/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionResultSnapshot.java b/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionResultSnapshot.java new file mode 100644 index 0000000000..119019dda1 --- /dev/null +++ b/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionResultSnapshot.java @@ -0,0 +1,37 @@ +package step.core.execution.model; + +import step.core.artefacts.reports.ReportNodeStatus; + +public class ExecutionResultSnapshot { + + private String id; + private ExecutionStatus status; + private ReportNodeStatus result; + + public String getId() { + return id; + } + + public ExecutionResultSnapshot setId(String id) { + this.id = id; + return this; + } + + public ExecutionStatus getStatus() { + return status; + } + + public ExecutionResultSnapshot setStatus(ExecutionStatus status) { + this.status = status; + return this; + } + + public ReportNodeStatus getResult() { + return result; + } + + public ExecutionResultSnapshot setResult(ReportNodeStatus result) { + this.result = result; + return this; + } +} diff --git a/step-plans/step-plans-core/src/main/java/step/core/repositories/AbstractRepository.java b/step-plans/step-plans-core/src/main/java/step/core/repositories/AbstractRepository.java index f48a4ce163..390c8efd20 100644 --- a/step-plans/step-plans-core/src/main/java/step/core/repositories/AbstractRepository.java +++ b/step-plans/step-plans-core/src/main/java/step/core/repositories/AbstractRepository.java @@ -39,6 +39,18 @@ private static Map getCanonicalRepositoryParameters(Set .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)) : null; } + public static String getCanonicalPlanName(Map repositoryParameters) { + if (repositoryParameters == null || repositoryParameters.isEmpty()) { + return ""; + } + + return repositoryParameters.entrySet().stream() + .sorted(Map.Entry.comparingByKey()) + .map(e -> e.getKey() + "=" + e.getValue()) + .collect(java.util.stream.Collectors.joining("&")); + } + + @Override public Set getCanonicalRepositoryParameters() { return canonicalRepositoryParameters; diff --git a/step-plans/step-plans-core/src/main/java/step/core/repositories/Repository.java b/step-plans/step-plans-core/src/main/java/step/core/repositories/Repository.java index ae4598515e..0f0f1f9053 100644 --- a/step-plans/step-plans-core/src/main/java/step/core/repositories/Repository.java +++ b/step-plans/step-plans-core/src/main/java/step/core/repositories/Repository.java @@ -54,4 +54,5 @@ default void postExecution(ExecutionContext context, RepositoryObjectReference r boolean compareCanonicalRepositoryParameters(Map repositoryParameters1, Map repositoryParameters2); Set getCanonicalRepositoryParameters(); + } diff --git a/step-plans/step-plans-core/src/main/java/step/core/repositories/RepositoryObjectManager.java b/step-plans/step-plans-core/src/main/java/step/core/repositories/RepositoryObjectManager.java index 3e8fe9807d..9afe5f4f09 100644 --- a/step-plans/step-plans-core/src/main/java/step/core/repositories/RepositoryObjectManager.java +++ b/step-plans/step-plans-core/src/main/java/step/core/repositories/RepositoryObjectManager.java @@ -31,6 +31,8 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; +import static step.core.repositories.AbstractRepository.getCanonicalPlanName; + public class RepositoryObjectManager { private static final Logger logger = LoggerFactory.getLogger(RepositoryObjectManager.class); @@ -48,7 +50,9 @@ public void registerRepository(String id, Repository repository) { public ImportResult importPlan(ExecutionContext context, RepositoryObjectReference artefact) throws Exception { String respositoryId = artefact.getRepositoryID(); Repository repository = getRepository(respositoryId); - return repository.importArtefact(context, artefact.getRepositoryParameters()); + ImportResult importResult = repository.importArtefact(context, artefact.getRepositoryParameters()); + importResult.setCanonicalPlanName(getCanonicalPlanName(artefact.getRepositoryParameters())); + return importResult; } public Repository getRepository(String respositoryId) { From e446cb86d22a6a31ff9145e7123270ac129ffcdc Mon Sep 17 00:00:00 2001 From: lucian-baciu Date: Fri, 27 Feb 2026 02:43:30 +0200 Subject: [PATCH 2/7] SED-4157-fixes on executions history --- .../src/test/resources/step.properties | 4 ++- .../ExecutionHistoryReportPlugin.java | 14 ++++++---- .../core/execution/ExecutionEngineRunner.java | 26 ++++--------------- .../step/core/execution/model/Execution.java | 3 +-- .../execution/model/ExecutionAccessor.java | 3 ++- .../model/ExecutionAccessorImpl.java | 6 ++--- .../model/ExecutionResultSnapshot.java | 10 +++++++ .../core/repositories/AbstractRepository.java | 8 +++--- .../step/core/repositories/Repository.java | 2 ++ .../repositories/RepositoryObjectManager.java | 4 +-- 10 files changed, 41 insertions(+), 39 deletions(-) diff --git a/step-controller/step-controller-backend/src/test/resources/step.properties b/step-controller/step-controller-backend/src/test/resources/step.properties index cd21b24d06..f4026a6e53 100644 --- a/step-controller/step-controller-backend/src/test/resources/step.properties +++ b/step-controller/step-controller-backend/src/test/resources/step.properties @@ -94,4 +94,6 @@ plugins.FunctionPackagePlugin.maven.repository.central.url=https://repo1.maven.o #timeseries.collections.week.enabled=true #timeseries.collections.week.flush.period=3600000 #timeseries.response.intervals.ideal=100 -#timeseries.response.intervals.max=1000 \ No newline at end of file +#timeseries.response.intervals.max=1000 + +#executions.history.collectCount=10 \ No newline at end of file diff --git a/step-plans/step-plans-base-artefacts/src/main/java/step/reporting/ExecutionHistoryReportPlugin.java b/step-plans/step-plans-base-artefacts/src/main/java/step/reporting/ExecutionHistoryReportPlugin.java index b2adb0d9a9..6ace87d50d 100644 --- a/step-plans/step-plans-base-artefacts/src/main/java/step/reporting/ExecutionHistoryReportPlugin.java +++ b/step-plans/step-plans-base-artefacts/src/main/java/step/reporting/ExecutionHistoryReportPlugin.java @@ -1,5 +1,6 @@ package step.reporting; +import ch.exense.commons.app.Configuration; import step.core.execution.ExecutionContext; import step.core.execution.model.Execution; import step.core.execution.model.ExecutionAccessor; @@ -13,6 +14,8 @@ @Plugin public class ExecutionHistoryReportPlugin extends AbstractExecutionEnginePlugin { + public static final String EXECUTIONS_HISTORY_COLLECT_COUNT = "executions.history.collectCount"; + @Override public void executionStart(ExecutionContext context) { // TOOD collect the executions here too @@ -20,18 +23,19 @@ public void executionStart(ExecutionContext context) { @Override public void afterExecutionEnd(ExecutionContext context) { + Configuration configuration = context.getConfiguration(); + Integer countItems = configuration.getPropertyAsInteger(EXECUTIONS_HISTORY_COLLECT_COUNT, 10); ExecutionAccessor executionAccessor = context.getExecutionAccessor(); Execution execution = context.getExecutionManager().getExecution(); // endTime is not set here - long searchBeforeTimestamp = System.currentTimeMillis() - 1; - List pastExecutionsSnapshots = executionAccessor.getLastEndedExecutionsByCanonicalPlanName(execution.getCanonicalPlanName(), 10, searchBeforeTimestamp) - .stream() + long searchBeforeTimestamp = execution.getEndTime() != null ? execution.getEndTime() : System.currentTimeMillis() - 1; + List pastExecutionsSnapshots = executionAccessor.getLastEndedExecutionsByCanonicalPlanName(execution.getCanonicalPlanName(), countItems, searchBeforeTimestamp) .map(e -> new ExecutionResultSnapshot() .setId(e.getId().toString()) .setResult(e.getResult()) .setStatus(e.getStatus()) - ) - .collect(Collectors.toList()); + .setStartTime(e.getStartTime())) + .collect(Collectors.toList()); execution.setHistoryResults(pastExecutionsSnapshots); executionAccessor.save(execution); } diff --git a/step-plans/step-plans-core/src/main/java/step/core/execution/ExecutionEngineRunner.java b/step-plans/step-plans-core/src/main/java/step/core/execution/ExecutionEngineRunner.java index db58cef5fd..fe0e7bf6be 100644 --- a/step-plans/step-plans-core/src/main/java/step/core/execution/ExecutionEngineRunner.java +++ b/step-plans/step-plans-core/src/main/java/step/core/execution/ExecutionEngineRunner.java @@ -86,27 +86,9 @@ protected PlanRunnerResult execute() { addImportResultToExecution(importResult); saveFailureReportWithResult(ReportNodeStatus.VETOED); } else { - String canonicalPlanName; try { - ExecutionParameters executionParameters = executionContext.getExecutionParameters(); - Plan plan = executionParameters.getPlan(); - if (plan == null) { - ImportResult importResult = importPlan(executionContext); - canonicalPlanName = importResult.getCanonicalPlanName(); - addImportResultToExecution(importResult); - if (importResult.isSuccessful()) { - PlanAccessor planAccessor = executionContext.getPlanAccessor(); - plan = planAccessor.get(new ObjectId(importResult.getPlanId())); - } else { - throw new PlanImportException(); - } - } else { - // plan already exists in memory - canonicalPlanName = plan.getId().toString(); - } - + Plan plan = getPlanFromExecutionParametersOrImport(); addPlanToContextAndUpdateExecution(plan); - addCanonicalPlanNameToExecution(canonicalPlanName); logger.info(messageWithId("Starting execution.")); updateStatus(ExecutionStatus.ESTIMATING); @@ -194,7 +176,6 @@ private List getExecutionVetoes() { .collect(Collectors.toList()); } - // TODO from here we need to extract the importResult, somehow private Plan getPlanFromExecutionParametersOrImport() throws PlanImportException { ExecutionParameters executionParameters = executionContext.getExecutionParameters(); Plan executionParametersPlan = executionParameters.getPlan(); @@ -215,7 +196,10 @@ private Plan getPlanFromExecutionParametersOrImport() throws PlanImportException } private void addImportResultToExecution(ImportResult importResult) { - updateExecution(e -> e.setImportResult(importResult)); + updateExecution(e -> { + e.setImportResult(importResult); + e.setCanonicalPlanName(importResult.getCanonicalPlanName()); + }); } private void addPlanToContextAndUpdateExecution(Plan plan) { diff --git a/step-plans/step-plans-core/src/main/java/step/core/execution/model/Execution.java b/step-plans/step-plans-core/src/main/java/step/core/execution/model/Execution.java index 097b3ef602..eae11d31fe 100644 --- a/step-plans/step-plans-core/src/main/java/step/core/execution/model/Execution.java +++ b/step-plans/step-plans-core/src/main/java/step/core/execution/model/Execution.java @@ -259,9 +259,8 @@ public List getHistoryResults() { return historyResults; } - public Execution setHistoryResults(List historyResults) { + public void setHistoryResults(List historyResults) { this.historyResults = historyResults; - return this; } @Override diff --git a/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionAccessor.java b/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionAccessor.java index 6690061a1c..a442d0349c 100644 --- a/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionAccessor.java +++ b/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionAccessor.java @@ -21,6 +21,7 @@ import java.util.Date; import java.util.List; import java.util.Map; +import java.util.stream.Stream; import step.core.accessors.Accessor; import step.core.collections.SearchOrder; @@ -51,5 +52,5 @@ public interface ExecutionAccessor extends Accessor, ExecutionProvide List getLastEndedExecutionsBySchedulerTaskID(String schedulerTaskID, int limit, Long from, Long to); - List getLastEndedExecutionsByCanonicalPlanName(String canonicalPlanName, int limit, Long from); + Stream getLastEndedExecutionsByCanonicalPlanName(String canonicalPlanName, int limit, Long from); } diff --git a/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionAccessorImpl.java b/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionAccessorImpl.java index 89aff5f9fb..960200b1e3 100644 --- a/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionAccessorImpl.java +++ b/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionAccessorImpl.java @@ -20,6 +20,7 @@ import java.util.*; import java.util.stream.Collectors; +import java.util.stream.Stream; import step.commons.iterators.SkipLimitIterator; import step.commons.iterators.SkipLimitProvider; @@ -178,7 +179,7 @@ public List getLastEndedExecutionsBySchedulerTaskID(String schedulerT } @Override - public List getLastEndedExecutionsByCanonicalPlanName(String canonicalPlanName, int limit, Long from) { + public Stream getLastEndedExecutionsByCanonicalPlanName(String canonicalPlanName, int limit, Long from) { SearchOrder order = new SearchOrder("endTime", -1); List filters = new ArrayList<>(List.of( @@ -191,7 +192,6 @@ public List getLastEndedExecutionsByCanonicalPlanName(String canonica } return collectionDriver - .find(Filters.and(filters), order, 0, limit, 0) - .collect(Collectors.toList()); + .find(Filters.and(filters), order, 0, limit, 0); } } diff --git a/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionResultSnapshot.java b/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionResultSnapshot.java index 119019dda1..dabe5bf432 100644 --- a/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionResultSnapshot.java +++ b/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionResultSnapshot.java @@ -7,6 +7,7 @@ public class ExecutionResultSnapshot { private String id; private ExecutionStatus status; private ReportNodeStatus result; + private long startTime; public String getId() { return id; @@ -34,4 +35,13 @@ public ExecutionResultSnapshot setResult(ReportNodeStatus result) { this.result = result; return this; } + + public long getStartTime() { + return startTime; + } + + public ExecutionResultSnapshot setStartTime(long startTime) { + this.startTime = startTime; + return this; + } } diff --git a/step-plans/step-plans-core/src/main/java/step/core/repositories/AbstractRepository.java b/step-plans/step-plans-core/src/main/java/step/core/repositories/AbstractRepository.java index 390c8efd20..bb643d9fd0 100644 --- a/step-plans/step-plans-core/src/main/java/step/core/repositories/AbstractRepository.java +++ b/step-plans/step-plans-core/src/main/java/step/core/repositories/AbstractRepository.java @@ -39,15 +39,17 @@ private static Map getCanonicalRepositoryParameters(Set .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)) : null; } - public static String getCanonicalPlanName(Map repositoryParameters) { + @Override + public String getCanonicalPlanName(Map repositoryParameters) { if (repositoryParameters == null || repositoryParameters.isEmpty()) { - return ""; + return null; } return repositoryParameters.entrySet().stream() + .filter(entry -> this.canonicalRepositoryParameters.contains(entry.getKey())) .sorted(Map.Entry.comparingByKey()) .map(e -> e.getKey() + "=" + e.getValue()) - .collect(java.util.stream.Collectors.joining("&")); + .collect(Collectors.joining("&")); } diff --git a/step-plans/step-plans-core/src/main/java/step/core/repositories/Repository.java b/step-plans/step-plans-core/src/main/java/step/core/repositories/Repository.java index 0f0f1f9053..41ec986415 100644 --- a/step-plans/step-plans-core/src/main/java/step/core/repositories/Repository.java +++ b/step-plans/step-plans-core/src/main/java/step/core/repositories/Repository.java @@ -55,4 +55,6 @@ default void postExecution(ExecutionContext context, RepositoryObjectReference r Set getCanonicalRepositoryParameters(); + String getCanonicalPlanName(Map repositoryParameters); + } diff --git a/step-plans/step-plans-core/src/main/java/step/core/repositories/RepositoryObjectManager.java b/step-plans/step-plans-core/src/main/java/step/core/repositories/RepositoryObjectManager.java index 9afe5f4f09..28c2b79318 100644 --- a/step-plans/step-plans-core/src/main/java/step/core/repositories/RepositoryObjectManager.java +++ b/step-plans/step-plans-core/src/main/java/step/core/repositories/RepositoryObjectManager.java @@ -31,8 +31,6 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; -import static step.core.repositories.AbstractRepository.getCanonicalPlanName; - public class RepositoryObjectManager { private static final Logger logger = LoggerFactory.getLogger(RepositoryObjectManager.class); @@ -51,7 +49,7 @@ public ImportResult importPlan(ExecutionContext context, RepositoryObjectReferen String respositoryId = artefact.getRepositoryID(); Repository repository = getRepository(respositoryId); ImportResult importResult = repository.importArtefact(context, artefact.getRepositoryParameters()); - importResult.setCanonicalPlanName(getCanonicalPlanName(artefact.getRepositoryParameters())); + importResult.setCanonicalPlanName(repository.getCanonicalPlanName(artefact.getRepositoryParameters())); return importResult; } From cc51f7e3f3739b1d4b53424f8d86761a6d670420 Mon Sep 17 00:00:00 2001 From: lucian-baciu Date: Fri, 27 Feb 2026 02:46:57 +0200 Subject: [PATCH 3/7] SED-4157-revert step.properties --- .../step-controller-backend/src/test/resources/step.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/step-controller/step-controller-backend/src/test/resources/step.properties b/step-controller/step-controller-backend/src/test/resources/step.properties index f4026a6e53..5082f9e85c 100644 --- a/step-controller/step-controller-backend/src/test/resources/step.properties +++ b/step-controller/step-controller-backend/src/test/resources/step.properties @@ -53,7 +53,7 @@ plugins.selenium.libs.3.x=../../../../step-distribution/step-distribution-parent plugins.selenium.libs.2.x=../../../../step-distribution/step-distribution-parent/step-distribution-controller/template-controller/ext/selenium/selenium-2.53.1 plugins.jmeter.home=../../../../step-distribution/step-distribution-parent/step-distribution-controller/template-controller/ext/jmeter plugins.javascript.libs=../../../../step-distribution/step-distribution-parent/step-distribution-controller/template-controller/ext/javascript -plugins.groovy.libs=../../../step-distribution/step-distribution-controller/template-controller/ext/groovy +plugins.groovy.libs=../../../../step-distribution/step-distribution-parent/step-distribution-controller/template-controller/ext/groovy authentication=true # Defines the path to the embedded function packages # plugins.FunctionPackagePlugin.embeddedpackages.folder=../../../../step-distribution/step-distribution-parent/step-distribution-controller/template-controller/plugins/keywords From 4b77a7161b42673fa823e94046abed1cfdbd0b83 Mon Sep 17 00:00:00 2001 From: lucian-baciu Date: Fri, 27 Feb 2026 03:18:56 +0200 Subject: [PATCH 4/7] SED-4157-cleanup --- .../ExecutionHistoryReportPlugin.java | 22 +++++++++---------- .../model/ExecutionResultSnapshot.java | 12 ++++------ 2 files changed, 14 insertions(+), 20 deletions(-) diff --git a/step-plans/step-plans-base-artefacts/src/main/java/step/reporting/ExecutionHistoryReportPlugin.java b/step-plans/step-plans-base-artefacts/src/main/java/step/reporting/ExecutionHistoryReportPlugin.java index 6ace87d50d..d0906946d2 100644 --- a/step-plans/step-plans-base-artefacts/src/main/java/step/reporting/ExecutionHistoryReportPlugin.java +++ b/step-plans/step-plans-base-artefacts/src/main/java/step/reporting/ExecutionHistoryReportPlugin.java @@ -12,15 +12,10 @@ import java.util.stream.Collectors; @Plugin -public class ExecutionHistoryReportPlugin extends AbstractExecutionEnginePlugin { +public class ExecutionHistoryReportPlugin extends AbstractExecutionEnginePlugin { public static final String EXECUTIONS_HISTORY_COLLECT_COUNT = "executions.history.collectCount"; - @Override - public void executionStart(ExecutionContext context) { - // TOOD collect the executions here too - } - @Override public void afterExecutionEnd(ExecutionContext context) { Configuration configuration = context.getConfiguration(); @@ -30,12 +25,15 @@ public void afterExecutionEnd(ExecutionContext context) { // endTime is not set here long searchBeforeTimestamp = execution.getEndTime() != null ? execution.getEndTime() : System.currentTimeMillis() - 1; List pastExecutionsSnapshots = executionAccessor.getLastEndedExecutionsByCanonicalPlanName(execution.getCanonicalPlanName(), countItems, searchBeforeTimestamp) - .map(e -> new ExecutionResultSnapshot() - .setId(e.getId().toString()) - .setResult(e.getResult()) - .setStatus(e.getStatus()) - .setStartTime(e.getStartTime())) - .collect(Collectors.toList()); + .map(e -> { + ExecutionResultSnapshot snapshot = new ExecutionResultSnapshot(); + snapshot.setId(e.getId().toString()); + snapshot.setResult(e.getResult()); + snapshot.setStatus(e.getStatus()); + snapshot.setStartTime(e.getStartTime()); + return snapshot; + }) + .collect(Collectors.toList()); execution.setHistoryResults(pastExecutionsSnapshots); executionAccessor.save(execution); } diff --git a/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionResultSnapshot.java b/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionResultSnapshot.java index dabe5bf432..c9272dd707 100644 --- a/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionResultSnapshot.java +++ b/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionResultSnapshot.java @@ -13,35 +13,31 @@ public String getId() { return id; } - public ExecutionResultSnapshot setId(String id) { + public void setId(String id) { this.id = id; - return this; } public ExecutionStatus getStatus() { return status; } - public ExecutionResultSnapshot setStatus(ExecutionStatus status) { + public void setStatus(ExecutionStatus status) { this.status = status; - return this; } public ReportNodeStatus getResult() { return result; } - public ExecutionResultSnapshot setResult(ReportNodeStatus result) { + public void setResult(ReportNodeStatus result) { this.result = result; - return this; } public long getStartTime() { return startTime; } - public ExecutionResultSnapshot setStartTime(long startTime) { + public void setStartTime(long startTime) { this.startTime = startTime; - return this; } } From a201787b75cc7da2e0368badaccc39579c89dd4d Mon Sep 17 00:00:00 2001 From: lucian-baciu Date: Sat, 28 Feb 2026 01:22:36 +0200 Subject: [PATCH 5/7] SED-4157-fixes --- .../step/reporting/ExecutionHistoryReportPlugin.java | 6 +++--- .../step/core/execution/ExecutionEngineRunner.java | 9 +-------- .../java/step/core/execution/model/Execution.java | 9 --------- .../step/core/execution/model/ExecutionAccessor.java | 3 ++- .../core/execution/model/ExecutionAccessorImpl.java | 12 ++++++++---- 5 files changed, 14 insertions(+), 25 deletions(-) diff --git a/step-plans/step-plans-base-artefacts/src/main/java/step/reporting/ExecutionHistoryReportPlugin.java b/step-plans/step-plans-base-artefacts/src/main/java/step/reporting/ExecutionHistoryReportPlugin.java index d0906946d2..1760985d16 100644 --- a/step-plans/step-plans-base-artefacts/src/main/java/step/reporting/ExecutionHistoryReportPlugin.java +++ b/step-plans/step-plans-base-artefacts/src/main/java/step/reporting/ExecutionHistoryReportPlugin.java @@ -8,6 +8,7 @@ import step.core.plugins.Plugin; import step.engine.plugins.AbstractExecutionEnginePlugin; +import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @@ -22,9 +23,8 @@ public void afterExecutionEnd(ExecutionContext context) { Integer countItems = configuration.getPropertyAsInteger(EXECUTIONS_HISTORY_COLLECT_COUNT, 10); ExecutionAccessor executionAccessor = context.getExecutionAccessor(); Execution execution = context.getExecutionManager().getExecution(); - // endTime is not set here - long searchBeforeTimestamp = execution.getEndTime() != null ? execution.getEndTime() : System.currentTimeMillis() - 1; - List pastExecutionsSnapshots = executionAccessor.getLastEndedExecutionsByCanonicalPlanName(execution.getCanonicalPlanName(), countItems, searchBeforeTimestamp) + long searchBeforeTimestamp = execution.getEndTime() != null ? execution.getEndTime() : System.currentTimeMillis(); + List pastExecutionsSnapshots = executionAccessor.getLastEndedExecutionsByCanonicalPlanName(execution.getImportResult().getCanonicalPlanName(), countItems, searchBeforeTimestamp, List.of(execution.getId().toString())) .map(e -> { ExecutionResultSnapshot snapshot = new ExecutionResultSnapshot(); snapshot.setId(e.getId().toString()); diff --git a/step-plans/step-plans-core/src/main/java/step/core/execution/ExecutionEngineRunner.java b/step-plans/step-plans-core/src/main/java/step/core/execution/ExecutionEngineRunner.java index fe0e7bf6be..da368e5a25 100644 --- a/step-plans/step-plans-core/src/main/java/step/core/execution/ExecutionEngineRunner.java +++ b/step-plans/step-plans-core/src/main/java/step/core/execution/ExecutionEngineRunner.java @@ -196,10 +196,7 @@ private Plan getPlanFromExecutionParametersOrImport() throws PlanImportException } private void addImportResultToExecution(ImportResult importResult) { - updateExecution(e -> { - e.setImportResult(importResult); - e.setCanonicalPlanName(importResult.getCanonicalPlanName()); - }); + updateExecution(e -> e.setImportResult(importResult)); } private void addPlanToContextAndUpdateExecution(Plan plan) { @@ -212,10 +209,6 @@ private void addPlanToContextAndUpdateExecution(Plan plan) { }); } - private void addCanonicalPlanNameToExecution(String canonicalPlanName) { - updateExecution(execution -> execution.setCanonicalPlanName(canonicalPlanName)); - } - private String messageWithId(String message) { return message + " Execution ID: " + executionContext.getExecutionId(); } diff --git a/step-plans/step-plans-core/src/main/java/step/core/execution/model/Execution.java b/step-plans/step-plans-core/src/main/java/step/core/execution/model/Execution.java index cc77b92bd6..823b7cc7ff 100644 --- a/step-plans/step-plans-core/src/main/java/step/core/execution/model/Execution.java +++ b/step-plans/step-plans-core/src/main/java/step/core/execution/model/Execution.java @@ -45,7 +45,6 @@ public class Execution extends AbstractOrganizableObject implements EnricheableO private ReportNodeStatus result; private List lifecycleErrors; private String planId; - private String canonicalPlanName; private ImportResult importResult; private List reportExports; private String executionTaskID; @@ -152,14 +151,6 @@ public void setPlanId(String planId) { this.planId = planId; } - public String getCanonicalPlanName() { - return canonicalPlanName; - } - - public void setCanonicalPlanName(String canonicalPlanName) { - this.canonicalPlanName = canonicalPlanName; - } - /** * @return the result of the import phase from the external repository (ALM, Jira, etc) */ diff --git a/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionAccessor.java b/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionAccessor.java index a442d0349c..2f71b96f36 100644 --- a/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionAccessor.java +++ b/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionAccessor.java @@ -21,6 +21,7 @@ import java.util.Date; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.stream.Stream; import step.core.accessors.Accessor; @@ -52,5 +53,5 @@ public interface ExecutionAccessor extends Accessor, ExecutionProvide List getLastEndedExecutionsBySchedulerTaskID(String schedulerTaskID, int limit, Long from, Long to); - Stream getLastEndedExecutionsByCanonicalPlanName(String canonicalPlanName, int limit, Long from); + Stream getLastEndedExecutionsByCanonicalPlanName(String canonicalPlanName, int limit, Long from, List excludeExecutionsIds); } diff --git a/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionAccessorImpl.java b/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionAccessorImpl.java index 960200b1e3..a5c2a61618 100644 --- a/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionAccessorImpl.java +++ b/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionAccessorImpl.java @@ -22,6 +22,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import org.apache.commons.collections.CollectionUtils; import step.commons.iterators.SkipLimitIterator; import step.commons.iterators.SkipLimitProvider; import step.core.accessors.AbstractAccessor; @@ -179,16 +180,19 @@ public List getLastEndedExecutionsBySchedulerTaskID(String schedulerT } @Override - public Stream getLastEndedExecutionsByCanonicalPlanName(String canonicalPlanName, int limit, Long from) { + public Stream getLastEndedExecutionsByCanonicalPlanName(String canonicalPlanName, int limit, Long searchBeforeTimestamp, List excludeExecutionsIds) { SearchOrder order = new SearchOrder("endTime", -1); List filters = new ArrayList<>(List.of( - Filters.equals("canonicalPlanName", canonicalPlanName), + Filters.equals("importResult.canonicalPlanName", canonicalPlanName), Filters.equals("status", ExecutionStatus.ENDED.name()) )); - if (from != null) { - filters.add(Filters.lte("endTime", from)); + if (searchBeforeTimestamp != null) { + filters.add(Filters.lte("endTime", searchBeforeTimestamp)); + } + if (CollectionUtils.isNotEmpty(excludeExecutionsIds)) { + filters.add(Filters.not(Filters.in("_id", excludeExecutionsIds))); } return collectionDriver From 6ba87cd477bd0aea38f742670a5314e6e36e9342 Mon Sep 17 00:00:00 2001 From: lucian-baciu Date: Sat, 28 Feb 2026 02:15:55 +0200 Subject: [PATCH 6/7] SED-4157-compile fixes --- .../java/step/reporting/ExecutionHistoryReportPlugin.java | 3 ++- .../java/step/core/execution/model/ExecutionAccessor.java | 2 +- .../step/core/execution/model/ExecutionAccessorImpl.java | 5 +++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/step-plans/step-plans-base-artefacts/src/main/java/step/reporting/ExecutionHistoryReportPlugin.java b/step-plans/step-plans-base-artefacts/src/main/java/step/reporting/ExecutionHistoryReportPlugin.java index 1760985d16..5bfe30b486 100644 --- a/step-plans/step-plans-base-artefacts/src/main/java/step/reporting/ExecutionHistoryReportPlugin.java +++ b/step-plans/step-plans-base-artefacts/src/main/java/step/reporting/ExecutionHistoryReportPlugin.java @@ -10,6 +10,7 @@ import java.util.Arrays; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; @Plugin @@ -24,7 +25,7 @@ public void afterExecutionEnd(ExecutionContext context) { ExecutionAccessor executionAccessor = context.getExecutionAccessor(); Execution execution = context.getExecutionManager().getExecution(); long searchBeforeTimestamp = execution.getEndTime() != null ? execution.getEndTime() : System.currentTimeMillis(); - List pastExecutionsSnapshots = executionAccessor.getLastEndedExecutionsByCanonicalPlanName(execution.getImportResult().getCanonicalPlanName(), countItems, searchBeforeTimestamp, List.of(execution.getId().toString())) + List pastExecutionsSnapshots = executionAccessor.getLastEndedExecutionsByCanonicalPlanName(execution.getImportResult().getCanonicalPlanName(), countItems, searchBeforeTimestamp, Set.of(execution.getId().toString())) .map(e -> { ExecutionResultSnapshot snapshot = new ExecutionResultSnapshot(); snapshot.setId(e.getId().toString()); diff --git a/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionAccessor.java b/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionAccessor.java index 2f71b96f36..b50f74e9c1 100644 --- a/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionAccessor.java +++ b/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionAccessor.java @@ -53,5 +53,5 @@ public interface ExecutionAccessor extends Accessor, ExecutionProvide List getLastEndedExecutionsBySchedulerTaskID(String schedulerTaskID, int limit, Long from, Long to); - Stream getLastEndedExecutionsByCanonicalPlanName(String canonicalPlanName, int limit, Long from, List excludeExecutionsIds); + Stream getLastEndedExecutionsByCanonicalPlanName(String canonicalPlanName, int limit, Long from, Set excludeExecutionsIds); } diff --git a/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionAccessorImpl.java b/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionAccessorImpl.java index a5c2a61618..fbdabf56c3 100644 --- a/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionAccessorImpl.java +++ b/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionAccessorImpl.java @@ -180,7 +180,7 @@ public List getLastEndedExecutionsBySchedulerTaskID(String schedulerT } @Override - public Stream getLastEndedExecutionsByCanonicalPlanName(String canonicalPlanName, int limit, Long searchBeforeTimestamp, List excludeExecutionsIds) { + public Stream getLastEndedExecutionsByCanonicalPlanName(String canonicalPlanName, int limit, Long searchBeforeTimestamp, Set excludeExecutionsIds) { SearchOrder order = new SearchOrder("endTime", -1); List filters = new ArrayList<>(List.of( @@ -192,7 +192,8 @@ public Stream getLastEndedExecutionsByCanonicalPlanName(String canoni filters.add(Filters.lte("endTime", searchBeforeTimestamp)); } if (CollectionUtils.isNotEmpty(excludeExecutionsIds)) { - filters.add(Filters.not(Filters.in("_id", excludeExecutionsIds))); + Filter ignoreExecutionsFilter = Filters.in("_id", new ArrayList<>(excludeExecutionsIds)); + filters.add(Filters.not(ignoreExecutionsFilter)); } return collectionDriver From 6589104f37b27fcdf44405a9094cccb624c67a23 Mon Sep 17 00:00:00 2001 From: lucian-baciu Date: Mon, 2 Mar 2026 11:08:21 +0200 Subject: [PATCH 7/7] SED-4157-method signature param rename --- .../main/java/step/core/execution/model/ExecutionAccessor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionAccessor.java b/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionAccessor.java index b50f74e9c1..3b07cd910e 100644 --- a/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionAccessor.java +++ b/step-plans/step-plans-core/src/main/java/step/core/execution/model/ExecutionAccessor.java @@ -53,5 +53,5 @@ public interface ExecutionAccessor extends Accessor, ExecutionProvide List getLastEndedExecutionsBySchedulerTaskID(String schedulerTaskID, int limit, Long from, Long to); - Stream getLastEndedExecutionsByCanonicalPlanName(String canonicalPlanName, int limit, Long from, Set excludeExecutionsIds); + Stream getLastEndedExecutionsByCanonicalPlanName(String canonicalPlanName, int limit, Long searchBeforeTimestamp, Set excludeExecutionsIds); }