.filter(s -> !StringUtils.isEmpty(s)) .collect(Collectors.toList()); ExecutionRepository.ExecutionCriteria executionCriteria = new ExecutionRepository.ExecutionCriteria() .setLimit(limit) .setStatuses(statusesList);
if (!criteria.getStatuses().isEmpty()) { allRedisDelegates().forEach(d -> d.withCommandsClient(c -> { List<String> pipelineKeys = new ArrayList<>(c.zrevrange(executionsByPipelineKey(pipelineConfigId), 0, -1)); Set<ExecutionStatus> allowedExecutionStatuses = new HashSet<>(criteria.getStatuses()); List<ExecutionStatus> statuses = fetchMultiExecutionStatus(d, pipelineKeys.stream() (RedisClientDelegate redisClientDelegate, Iterable<String> pipelineIds) -> (String key) -> !criteria.getStatuses().isEmpty() ? pipelineIds : redisClientDelegate.withCommandsClient(p -> { return p.zrevrange(key, 0, (criteria.getPageSize() - 1)); currentPipelineIds = currentPipelineIds.subList(0, Math.min(criteria.getPageSize(), currentPipelineIds.size())); previousPipelineIds = previousPipelineIds.subList(0, Math.min(criteria.getPageSize(), previousPipelineIds.size()));
if (!criteria.getStatuses().isEmpty()) { allRedisDelegates().forEach(d -> d.withCommandsClient(c -> { List<String> orchestrationKeys = new ArrayList<>(c.smembers(allOrchestrationsKey)); Set<ExecutionStatus> allowedExecutionStatuses = new HashSet<>(criteria.getStatuses()); List<ExecutionStatus> statuses = fetchMultiExecutionStatus(d, orchestrationKeys.stream() (String key) -> ( redisClientDelegate.withCommandsClient(c -> { if (!criteria.getStatuses().isEmpty()) { return orchestrationIds; return unfiltered.subList(0, Math.min(criteria.getPageSize(), unfiltered.size())); })); currentOrchestrationIds = currentOrchestrationIds.subList(0, Math.min(criteria.getPageSize(), currentOrchestrationIds.size())); previousOrchestrationIds = previousOrchestrationIds.subList(0, Math.min(criteria.getPageSize(), previousOrchestrationIds.size()));
/** * If {@code executionId} is set, it will be retrieved. Otherwise, {@code pipelineConfigId} will be used to find the * newest pipeline execution for that configuration. * @param executionId An explicit pipeline execution id. * @param pipelineConfigId A pipeline configuration id. Ignored if {@code executionId} is set. * @return The pipeline * @throws IllegalArgumentException if neither executionId or pipelineConfigId are provided * @throws ExecutionNotFoundException if no execution could be found */ public Execution retrievePipelineOrNewestExecution(@Nullable String executionId, @Nullable String pipelineConfigId) throws ExecutionNotFoundException { if (executionId != null) { // Use an explicit execution return executionRepository.retrieve(PIPELINE, executionId); } else if (pipelineConfigId != null) { // No executionId set - use last execution ExecutionRepository.ExecutionCriteria criteria = new ExecutionRepository.ExecutionCriteria().setPageSize(1); try { return executionRepository.retrievePipelinesForPipelineConfigId(pipelineConfigId, criteria) .toSingle() .toBlocking() .value(); } catch (NoSuchElementException e) { throw new ExecutionNotFoundException("No pipeline execution could be found for config id " + pipelineConfigId + ": " + e.getMessage()); } } else { throw new IllegalArgumentException("Either executionId or pipelineConfigId have to be set."); } }
@Override public @Nonnull List<Execution> retrievePipelinesForPipelineConfigIdsBetweenBuildTimeBoundary( @Nonnull List<String> pipelineConfigIds, long buildTimeStartBoundary, long buildTimeEndBoundary, ExecutionCriteria executionCriteria ) { List<Execution> executions = new ArrayList<>(); allRedisDelegates() .forEach(d -> { List<Execution> pipelines = getPipelinesForPipelineConfigIdsBetweenBuildTimeBoundaryFromRedis( d, pipelineConfigIds, buildTimeStartBoundary, buildTimeEndBoundary ); executions.addAll(pipelines); }); return executions.stream() .filter( it -> { if (executionCriteria.getStatuses().isEmpty()) { return true; } else { return executionCriteria.getStatuses().contains(it.getStatus()); } }) .collect(Collectors.toList()); }
List<Artifact> priorArtifacts = getArtifactsForPipelineId((String) pipeline.get("id"), new ExecutionCriteria()); Set<Artifact> resolvedArtifacts = resolveExpectedArtifacts(expectedArtifacts, receivedArtifacts, priorArtifacts, true); Set<Artifact> allArtifacts = new HashSet<>(receivedArtifacts);
@Override public @Nonnull Observable<Execution> retrieve( @Nonnull ExecutionType type, @Nonnull ExecutionCriteria criteria ) { List<Observable<Execution>> observables = allRedisDelegates() .stream() .map(d -> { Observable<Execution> observable = all(type, d); if (!criteria.getStatuses().isEmpty()) { observable = observable.filter(execution -> criteria.getStatuses().contains(execution.getStatus())); } if (criteria.getPageSize() > 0) { observable = observable.limit(criteria.getPageSize()); } return observable; } ) .collect(Collectors.toList()); return Observable.merge(observables); }
@VisibleForTesting protected void tick() { LongTaskTimer timer = registry.longTaskTimer(timerId); long timerId = timer.start(); log.info("Starting cleanup"); try { executionRepository.retrieveAllApplicationNames(ORCHESTRATION, threshold).forEach(app -> { log.info("Cleaning up orchestration executions (application: {}, threshold: {})", app, threshold); ExecutionCriteria executionCriteria = new ExecutionCriteria(); executionCriteria.setPageSize(Integer.MAX_VALUE); cleanup(executionRepository.retrieveOrchestrationsForApplication(app, executionCriteria), app, "orchestration"); }); } catch (Exception e) { log.error("Cleanup failed", e); } finally { timer.stop(timerId); } }
@Nonnull @Override public List<Execution> retrieveOrchestrationsForApplication(@Nonnull String application, @Nonnull ExecutionCriteria criteria, @Nullable ExecutionComparator sorter) { List<Execution> executions = retrieveOrchestrationsForApplication(application, criteria) .filter((orchestration) -> { if (criteria.getStartTimeCutoff() != null) { long startTime = Optional.ofNullable(orchestration.getStartTime()).orElse(0L); return startTime == 0 || (startTime > criteria.getStartTimeCutoff().toEpochMilli()); } return true; }) .subscribeOn(Schedulers.io()) .toList() .toBlocking() .single(); if (sorter != null) { executions.sort(sorter); } return executions.subList(0, Math.min(executions.size(), criteria.getPageSize())); }
@Override public List<Execution> retrieveAllPipelinesForPipelineConfigIdsBetweenBuildTimeBoundary( @Nonnull List<String> pipelineConfigIds, long buildTimeStartBoundary, long buildTimeEndBoundary, ExecutionCriteria executionCriteria ) { List<Execution> executions = retrievePipelinesForPipelineConfigIdsBetweenBuildTimeBoundary( pipelineConfigIds, buildTimeStartBoundary, buildTimeEndBoundary, executionCriteria ); executions.sort(executionCriteria.getSortType()); return executions; }
ExecutionCriteria toCriteria() { List<String> statuses = new ArrayList<>(); if (succeeded) { statuses.add("SUCCEEDED"); } if (terminal) { statuses.add("TERMINAL"); } if (running) { statuses.add("RUNNING"); } return new ExecutionCriteria().setStatuses(statuses); } }
public @Nonnull ExecutionCriteria setStatuses(Collection<String> statuses) { return setStatuses( statuses .stream() .map(it -> ExecutionStatus.valueOf(it.toUpperCase())) .collect(toList()) .toArray(new ExecutionStatus[statuses.size()]) ); }