public static WorkflowInstance parseKey(String key) { final int lastHashPos = key.lastIndexOf('#'); if (lastHashPos < 1) { throw new IllegalArgumentException("Key must contain a hash '#' sign on position > 0"); } final WorkflowId workflowId = WorkflowId.parseKey(key.substring(0, lastHashPos)); return create(workflowId, key.substring(lastHashPos + 1)); }
private EventsPayload eventsForWorkflowInstance(String cid, String eid, String iid) { final WorkflowId workflowId = WorkflowId.create(cid, eid); final WorkflowInstance workflowInstance = WorkflowInstance.create(workflowId, iid); try { final Set<SequenceEvent> sequenceEvents = storage.readEvents(workflowInstance); final List<EventsPayload.TimestampedEvent> timestampedEvents = sequenceEvents.stream() .map(sequenceEvent -> EventsPayload.TimestampedEvent.create( sequenceEvent.event(), sequenceEvent.timestamp())) .collect(toList()); return EventsPayload.create(timestampedEvents); } catch (IOException e) { throw new RuntimeException(e); } } }
List<WorkflowInstanceExecutionData> executionData(WorkflowId workflowId, String start, String stop) throws IOException { try (final Table eventsTable = connection.getTable(EVENTS_TABLE_NAME)) { final Scan scan = new Scan() .setRowPrefixFilter(Bytes.toBytes(workflowId.toKey() + '#')) .setFilter(new FirstKeyOnlyFilter()); final WorkflowInstance startRow = WorkflowInstance.create(workflowId, start); scan.setStartRow(Bytes.toBytes(startRow.toKey() + '#')); if (!Strings.isNullOrEmpty(stop)) { final WorkflowInstance stopRow = WorkflowInstance.create(workflowId, stop); scan.setStopRow(Bytes.toBytes(stopRow.toKey() + '#')); } final Set<WorkflowInstance> workflowInstancesSet = Sets.newHashSet(); try (ResultScanner scanner = eventsTable.getScanner(scan)) { Result result = scanner.next(); while (result != null) { final String key = new String(result.getRow()); final int lastHash = key.lastIndexOf('#'); final WorkflowInstance wfi = WorkflowInstance.parseKey(key.substring(0, lastHash)); workflowInstancesSet.add(wfi); result = scanner.next(); } } return executionData(workflowInstancesSet); } }
private WorkflowInstance parseWorkflowInstance(Entity activeWorkflowInstance) { final String componentId = activeWorkflowInstance.getString(PROPERTY_COMPONENT); final String workflowId = activeWorkflowInstance.getString(PROPERTY_WORKFLOW); final String parameter = activeWorkflowInstance.getString(PROPERTY_PARAMETER); return WorkflowInstance.create(WorkflowId.create(componentId, workflowId), parameter); }
List<WorkflowInstanceExecutionData> executionData(WorkflowId workflowId, String offset, int limit) throws IOException { try (final Table eventsTable = connection.getTable(EVENTS_TABLE_NAME)) { final Scan scan = new Scan() .setRowPrefixFilter(Bytes.toBytes(workflowId.toKey() + '#')) .setFilter(new FirstKeyOnlyFilter()); if (!Strings.isNullOrEmpty(offset)) { final WorkflowInstance offsetInstance = WorkflowInstance.create(workflowId, offset); scan.setStartRow(Bytes.toBytes(offsetInstance.toKey() + '#')); } final Set<WorkflowInstance> workflowInstancesSet = Sets.newHashSet(); try (ResultScanner scanner = eventsTable.getScanner(scan)) { Result result = scanner.next(); while (result != null) { final String key = new String(result.getRow()); final int lastHash = key.lastIndexOf('#'); final WorkflowInstance wfi = WorkflowInstance.parseKey(key.substring(0, lastHash)); workflowInstancesSet.add(wfi); if (workflowInstancesSet.size() == limit) { break; } result = scanner.next(); } } return executionData(workflowInstancesSet); } }
@Override public CompletionStage<Void> event(Workflow workflow, Trigger trigger, Instant instant, TriggerParameters parameters) { if (!workflow.configuration().dockerImage().isPresent()) { LOG.warn("{} has no docker image, skipping", workflow.id()); return CompletableFuture.completedFuture(null); } final String parameter = toParameter(workflow.configuration().schedule(), instant); final WorkflowInstance workflowInstance = WorkflowInstance.create(workflow.id(), parameter); try { return stateManager.trigger(workflowInstance, trigger, parameters); } catch (IsClosedException isClosedException) { LOG.warn("State receiver is closed when processing workflow {} for trigger {} at {}", workflow, trigger, instant, isClosedException); return exceptionallyCompletedFuture(isClosedException); } } }
@Override public CompletionStage<Void> retryWorkflowInstance(String componentId, String workflowId, String parameter) { final Builder url = urlBuilder("scheduler", "retry"); final WorkflowInstance workflowInstance = WorkflowInstance.create( WorkflowId.create(componentId, workflowId), parameter); return execute(forUri(url, "POST", workflowInstance)) .thenApply(response -> null); }
@Override public CompletionStage<Void> haltWorkflowInstance(String componentId, String workflowId, String parameter) { final Builder url = urlBuilder("scheduler", "halt"); final WorkflowInstance workflowInstance = WorkflowInstance.create( WorkflowId.create(componentId, workflowId), parameter); return execute(forUri(url, "POST", workflowInstance)) .thenApply(response -> null); }
final WorkflowInstance wfi = WorkflowInstance.create( backfill.workflowId(), toParameter(backfill.schedule(), instant)); return RunStateData.create(wfi, WAITING, StateData.zero());
private Response<WorkflowInstanceExecutionData> instance( String componentId, String id, String instanceId) { final WorkflowId workflowId = WorkflowId.create(componentId, id); final WorkflowInstance workflowInstance = WorkflowInstance.create(workflowId, instanceId); try { final WorkflowInstanceExecutionData workflowInstanceExecutionData = storage.executionData(workflowInstance); return Response.forPayload(workflowInstanceExecutionData); } catch (ResourceNotFoundException e) { return Response.forStatus(Status.NOT_FOUND.withReasonPhrase(e.getMessage())); } catch (IOException e) { return Response.forStatus( Status.INTERNAL_SERVER_ERROR.withReasonPhrase("Couldn't fetch execution info.")); } }
private RunStateData getRunStateData(Backfill backfill, Map<WorkflowInstance, RunState> activeWorkflowInstances, Instant instant) { final WorkflowInstance wfi = WorkflowInstance .create(backfill.workflowId(), toParameter(backfill.schedule(), instant)); if (activeWorkflowInstances.containsKey(wfi)) { final RunState state = activeWorkflowInstances.get(wfi); return RunStateData.newBuilder() .workflowInstance(state.workflowInstance()) .state(state.state().name()) .stateData(state.data()) .latestTimestamp(state.timestamp()) .build(); } return ReplayEvents.getBackfillRunStateData(wfi, storage, backfill.id()) .orElse(RunStateData.create(wfi, UNKNOWN, StateData.zero())); } }
final WorkflowInstance workflowInstance = WorkflowInstance.create(workflow.id(), toParameter(workflow.configuration().schedule(), instantSpec.instant()));
private Response<TriggerRequest> triggerWorkflowInstance( AuthContext ac, RequestContext rc, TriggerRequest triggerRequest) { final WorkflowInstance workflowInstance = WorkflowInstance.create( triggerRequest.workflowId(), triggerRequest.parameter()); final Workflow workflow;
final List<WorkflowInstance> alreadyActive = instants.stream() .map(instant -> WorkflowInstance.create(workflowId, toParameter(schedule, instant))) .filter(activeWorkflowInstances::contains) .collect(toList());